Micron Document
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
| SparkN0de-git | SparkN0de |
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------


Displaying Raw • Download


nomadnet/RRC.py d661ba053183dfd1c9d3350bc2a8a7d1a70a2ecf (d661ba05) Text, 51.08 KB

Tff7b72import T7ee787os
Tff7b72import T7ee787re
Tff7b72import T7ee787time
Tff7b72import T7ee787threading
Tff7b72import T7ee787hashlib
Tff7b72from T7ee787collections Tff7b72import Te6edf3deque

Tff7b72import T7ee787RNS

Tff7b72from T7ee787nomadnetT7ee787.T7ee787vendor Tff7b72import Te6edf3cbor


Te6edf3HISTORY_DIR_NAME Tff7b72= Ta5d6ff"Ta5d6ffrrc_historyTa5d6ff"
Te6edf3HISTORY_FILENAME_SANITIZE_RE Tff7b72= Te6edf3reTff7b72.Td2a8ffcompileTb4b4b4(Ta5d6ffrTa5d6ff"Ta5d6ff[^a-z0-9._-]+Ta5d6ff"Tb4b4b4)

Te6edf3H_KIND Tff7b72= Ta5d6ff"Ta5d6ffkTa5d6ff"
Te6edf3H_SRC Tff7b72= Ta5d6ff"Ta5d6ffsTa5d6ff"
Te6edf3H_NICK Tff7b72= Ta5d6ff"Ta5d6ffnTa5d6ff"
Te6edf3H_TEXT Tff7b72= Ta5d6ff"Ta5d6fftTa5d6ff"
Te6edf3H_TS Tff7b72= Ta5d6ff"Ta5d6fftsTa5d6ff"
Te6edf3H_MENTION Tff7b72= Ta5d6ff"Ta5d6ffmTa5d6ff"


Te6edf3_MENTION_RE_CACHE Tff7b72= Tb4b4b4{Tb4b4b4}


Tff7b72def Td2a8ff_mention_reTb4b4b4(Te6edf3nickTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72not Tffa657isinstanceTb4b4b4(Te6edf3nickTb4b4b4, Tffa657strTb4b4b4) Tff7b72or Tff7b72not Te6edf3nickTb4b4b4:
Tff7b72return Tff7b72None
Te6edf3pat Tff7b72= Te6edf3_MENTION_RE_CACHETff7b72.Td2a8ffgetTb4b4b4(Te6edf3nickTb4b4b4)
Tff7b72if Te6edf3pat Tff7b72is Tff7b72NoneTb4b4b4:
Te6edf3pat Tff7b72= Te6edf3reTff7b72.Td2a8ffcompileTb4b4b4(Ta5d6ffrTa5d6ff"Ta5d6ff(?<![A-Za-z0-9_])@Ta5d6ff"Tff7b72+Te6edf3reTff7b72.Td2a8ffescapeTb4b4b4(Te6edf3nickTb4b4b4)Tff7b72+Ta5d6ffrTa5d6ff"Ta5d6ff(?![A-Za-z0-9_])Ta5d6ff"Tb4b4b4, Te6edf3reTff7b72.Td2a8ffIGNORECASETb4b4b4)
Tff7b72if Tffa657lenTb4b4b4(Te6edf3_MENTION_RE_CACHETb4b4b4) Tff7b72> T79c0ff32Tb4b4b4:
Te6edf3_MENTION_RE_CACHETff7b72.Td2a8ffclearTb4b4b4(Tb4b4b4)
Te6edf3_MENTION_RE_CACHETb4b4b4[Te6edf3nickTb4b4b4] Tff7b72= Te6edf3pat
Tff7b72return Te6edf3pat

T8b949e# https://github.com/kc1awv/rrcd/blob/main/rrcd/constants.py
Te6edf3RRC_VERSION Tff7b72= T79c0ff1

Te6edf3K_V Tff7b72= T79c0ff0
Te6edf3K_T Tff7b72= T79c0ff1
Te6edf3K_ID Tff7b72= T79c0ff2
Te6edf3K_TS Tff7b72= T79c0ff3
Te6edf3K_SRC Tff7b72= T79c0ff4
Te6edf3K_ROOM Tff7b72= T79c0ff5
Te6edf3K_BODY Tff7b72= T79c0ff6
Te6edf3K_NICK Tff7b72= T79c0ff7

Te6edf3T_HELLO Tff7b72= T79c0ff1
Te6edf3T_WELCOME Tff7b72= T79c0ff2

Te6edf3T_JOIN Tff7b72= T79c0ff10
Te6edf3T_JOINED Tff7b72= T79c0ff11
Te6edf3T_PART Tff7b72= T79c0ff12
Te6edf3T_PARTED Tff7b72= T79c0ff13

Te6edf3T_MSG Tff7b72= T79c0ff20
Te6edf3T_NOTICE Tff7b72= T79c0ff21

Te6edf3T_PING Tff7b72= T79c0ff30
Te6edf3T_PONG Tff7b72= T79c0ff31

Te6edf3T_ERROR Tff7b72= T79c0ff40

Te6edf3T_RESOURCE_ENVELOPE Tff7b72= T79c0ff50

Te6edf3B_HELLO_NAME Tff7b72= T79c0ff0
Te6edf3B_HELLO_VER Tff7b72= T79c0ff1
Te6edf3B_HELLO_CAPS Tff7b72= T79c0ff2

Te6edf3B_WELCOME_HUB Tff7b72= T79c0ff0
Te6edf3B_WELCOME_VER Tff7b72= T79c0ff1
Te6edf3B_WELCOME_CAPS Tff7b72= T79c0ff2
Te6edf3B_WELCOME_LIMITS Tff7b72= T79c0ff3

Te6edf3L_MAX_NICK_BYTES Tff7b72= T79c0ff0
Te6edf3L_MAX_ROOM_NAME_BYTES Tff7b72= T79c0ff1
Te6edf3L_MAX_MSG_BODY_BYTES Tff7b72= T79c0ff2
Te6edf3L_MAX_ROOMS_PER_SESSION Tff7b72= T79c0ff3
Te6edf3L_RATE_LIMIT_MSGS_PER_MINUTETff7b72= T79c0ff4

Te6edf3CAP_RESOURCE_ENVELOPE Tff7b72= T79c0ff0

Te6edf3B_RES_ID Tff7b72= T79c0ff0
Te6edf3B_RES_KIND Tff7b72= T79c0ff1
Te6edf3B_RES_SIZE Tff7b72= T79c0ff2
Te6edf3B_RES_SHA256 Tff7b72= T79c0ff3
Te6edf3B_RES_ENCODING Tff7b72= T79c0ff4

Te6edf3RES_KIND_NOTICE Tff7b72= Ta5d6ff"Ta5d6ffnoticeTa5d6ff"
Te6edf3RES_KIND_MOTD Tff7b72= Ta5d6ff"Ta5d6ffmotdTa5d6ff"
Te6edf3RES_KIND_BLOB Tff7b72= Ta5d6ff"Ta5d6ffblobTa5d6ff"

Te6edf3DEFAULT_DEST_NAME Tff7b72= Ta5d6ff"Ta5d6ffrrc.hubTa5d6ff"
Te6edf3DEFAULT_MAX_NICK_BYTES Tff7b72= T79c0ff32
Te6edf3DEFAULT_MAX_ROOM_BYTES Tff7b72= T79c0ff64
Te6edf3DEFAULT_MAX_MSG_BYTES Tff7b72= T79c0ff350
Te6edf3DEFAULT_MAX_ROOMS Tff7b72= T79c0ff32
Te6edf3DEFAULT_RATE_PER_MINUTE Tff7b72= T79c0ff240






Tff7b72def Td2a8ff_now_msTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72return Tffa657intTb4b4b4(Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)Tff7b72*T79c0ff1000Tb4b4b4)


Tff7b72def Td2a8ff_msg_idTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72return Te6edf3osTff7b72.Td2a8ffurandomTb4b4b4(T79c0ff8Tb4b4b4)


T8b949e# greedy .+ intentionally captures nicks containing parens like "user (alt) (deadbeefcafe)"
Te6edf3_WHO_ENTRY_RE Tff7b72= Te6edf3reTff7b72.Td2a8ffcompileTb4b4b4(
Ta5d6ffrTa5d6ff"Ta5d6ff(?:^|,Ta5d6ff\Ta5d6ffs)Ta5d6ff"
Ta5d6ffrTa5d6ff"Ta5d6ff(?:(?P<bh>[0-9a-fA-F]Tffd700{32}Ta5d6ff)|(?P<nick>.+?)Ta5d6ff\Ta5d6ffsTa5d6ff\Ta5d6ff((?P<np>[0-9a-fA-F]Tffd700{12}Ta5d6ff)Ta5d6ff\Ta5d6ff))Ta5d6ff"
Ta5d6ffrTa5d6ff"Ta5d6ff(?=,Ta5d6ff\Ta5d6ffs|$)Ta5d6ff"
Tb4b4b4)


T8b949e# hub /who response format: "members in <room>: nick1 (hex12), nick2 (hex12), <full_hex>, ..."
T8b949e# nicked users carry only a 12-hex prefix of their identity hash; un-nicked users appear as the full hex
Tff7b72def Td2a8ff_parse_who_noticeTb4b4b4(Te6edf3textTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72not Tffa657isinstanceTb4b4b4(Te6edf3textTb4b4b4, Tffa657strTb4b4b4)Tb4b4b4:
Tff7b72return Tff7b72None
Te6edf3prefix Tff7b72= Ta5d6ff"Ta5d6ffmembers in Ta5d6ff"
Tff7b72if Tff7b72not Te6edf3textTff7b72.Td2a8ffstartswithTb4b4b4(Te6edf3prefixTb4b4b4)Tb4b4b4:
Tff7b72return Tff7b72None
Te6edf3sep_idx Tff7b72= Te6edf3textTff7b72.Td2a8fffindTb4b4b4(Ta5d6ff"Ta5d6ff: Ta5d6ff"Tb4b4b4, Tffa657lenTb4b4b4(Te6edf3prefixTb4b4b4)Tb4b4b4)
Tff7b72if Te6edf3sep_idx Tff7b72< T79c0ff0Tb4b4b4:
Tff7b72return Tff7b72None
Te6edf3room Tff7b72= Te6edf3textTb4b4b4[Tffa657lenTb4b4b4(Te6edf3prefixTb4b4b4)Tb4b4b4:Te6edf3sep_idxTb4b4b4]Tff7b72.Td2a8ffstripTb4b4b4(Tb4b4b4)Tff7b72.Td2a8fflowerTb4b4b4(Tb4b4b4)
Tff7b72if Tff7b72not Te6edf3roomTb4b4b4:
Tff7b72return Tff7b72None
Te6edf3body Tff7b72= Te6edf3textTb4b4b4[Te6edf3sep_idxTff7b72+T79c0ff2Tb4b4b4:Tb4b4b4]Tff7b72.Td2a8ffstripTb4b4b4(Tb4b4b4)
Te6edf3entries Tff7b72= Tb4b4b4[Tb4b4b4]
Tff7b72if Te6edf3body Tff7b72and Te6edf3body Tff7b72!= Ta5d6ff"Ta5d6ff(none)Ta5d6ff"Tb4b4b4:
Tff7b72for Te6edf3m Tff7b72in Te6edf3_WHO_ENTRY_RETff7b72.Td2a8fffinditerTb4b4b4(Te6edf3bodyTb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3mTff7b72.Td2a8ffgroupTb4b4b4(Ta5d6ff"Ta5d6ffnickTa5d6ff"Tb4b4b4) Tff7b72is Tff7b72not Tff7b72NoneTb4b4b4:
Te6edf3entriesTff7b72.Td2a8ffappendTb4b4b4(Tb4b4b4(Te6edf3mTff7b72.Td2a8ffgroupTb4b4b4(Ta5d6ff"Ta5d6ffnickTa5d6ff"Tb4b4b4)Tff7b72.Td2a8ffstripTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3mTff7b72.Td2a8ffgroupTb4b4b4(Ta5d6ff"Ta5d6ffnpTa5d6ff"Tb4b4b4)Tff7b72.Td2a8fflowerTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4)
Tff7b72elif Te6edf3mTff7b72.Td2a8ffgroupTb4b4b4(Ta5d6ff"Ta5d6ffbhTa5d6ff"Tb4b4b4) Tff7b72is Tff7b72not Tff7b72NoneTb4b4b4:
Te6edf3entriesTff7b72.Td2a8ffappendTb4b4b4(Tb4b4b4(Tff7b72NoneTb4b4b4, Te6edf3mTff7b72.Td2a8ffgroupTb4b4b4(Ta5d6ff"Ta5d6ffbhTa5d6ff"Tb4b4b4)Tff7b72.Td2a8fflowerTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4)
Tff7b72return Tb4b4b4(Te6edf3roomTb4b4b4, Te6edf3entriesTb4b4b4)


Tff7b72def Td2a8ff_parse_room_list_noticeTb4b4b4(Te6edf3textTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72not Tffa657isinstanceTb4b4b4(Te6edf3textTb4b4b4, Tffa657strTb4b4b4)Tb4b4b4:
Tff7b72return Tff7b72None
Te6edf3stripped Tff7b72= Te6edf3textTff7b72.Td2a8ffstripTb4b4b4(Tb4b4b4)
Tff7b72if Te6edf3stripped Tff7b72== Ta5d6ff"Ta5d6ffNo public rooms registeredTa5d6ff"Tb4b4b4:
Tff7b72return Tb4b4b4{Tb4b4b4}
Te6edf3lines Tff7b72= Te6edf3textTff7b72.Td2a8ffsplitTb4b4b4(Ta5d6ff"Tffea00\nTa5d6ff"Tb4b4b4)
Tff7b72if Tff7b72not Te6edf3lines Tff7b72or Tff7b72not Te6edf3linesTb4b4b4[T79c0ff0Tb4b4b4]Tff7b72.Td2a8fflstripTb4b4b4(Tb4b4b4)Tff7b72.Td2a8ffstartswithTb4b4b4(Ta5d6ff"Ta5d6ffRegistered public roomsTa5d6ff"Tb4b4b4)Tb4b4b4:
Tff7b72return Tff7b72None
Te6edf3rooms Tff7b72= Tb4b4b4{Tb4b4b4}
Tff7b72for Te6edf3line Tff7b72in Te6edf3linesTb4b4b4[T79c0ff1Tb4b4b4:Tb4b4b4]Tb4b4b4:
Te6edf3s Tff7b72= Te6edf3lineTff7b72.Td2a8ffstripTb4b4b4(Tb4b4b4)
Tff7b72if Tff7b72not Te6edf3sTb4b4b4:
Tff7b72continue
Tff7b72if Ta5d6ff"Ta5d6ff - Ta5d6ff" Tff7b72in Te6edf3sTb4b4b4:
Te6edf3nameTb4b4b4, Te6edf3topic Tff7b72= Te6edf3sTff7b72.Td2a8ffsplitTb4b4b4(Ta5d6ff"Ta5d6ff - Ta5d6ff"Tb4b4b4, T79c0ff1Tb4b4b4)
Te6edf3roomsTb4b4b4[Te6edf3nameTff7b72.Td2a8ffstripTb4b4b4(Tb4b4b4)Tff7b72.Td2a8fflowerTb4b4b4(Tb4b4b4)Tb4b4b4] Tff7b72= Te6edf3topicTff7b72.Td2a8ffstripTb4b4b4(Tb4b4b4) Tff7b72or Tff7b72None
Tff7b72elseTb4b4b4:
Te6edf3roomsTb4b4b4[Te6edf3sTff7b72.Td2a8ffstripTb4b4b4(Tb4b4b4)Tff7b72.Td2a8fflstripTb4b4b4(Ta5d6ff"Ta5d6ff#Ta5d6ff"Tb4b4b4)Tff7b72.Td2a8fflowerTb4b4b4(Tb4b4b4)Tb4b4b4] Tff7b72= Tff7b72None
Tff7b72return Te6edf3rooms


Tff7b72def Td2a8ff_make_envelopeTb4b4b4(Te6edf3msg_typeTb4b4b4, Te6edf3srcTb4b4b4, Te6edf3roomTff7b72=Tff7b72NoneTb4b4b4, Te6edf3bodyTff7b72=Tff7b72NoneTb4b4b4, Te6edf3nickTff7b72=Tff7b72NoneTb4b4b4, Te6edf3midTff7b72=Tff7b72NoneTb4b4b4, Te6edf3tsTff7b72=Tff7b72NoneTb4b4b4)Tb4b4b4:
Te6edf3env Tff7b72= Tb4b4b4{
Te6edf3K_VTb4b4b4: Te6edf3RRC_VERSIONTb4b4b4,
Te6edf3K_TTb4b4b4: Tffa657intTb4b4b4(Te6edf3msg_typeTb4b4b4)Tb4b4b4,
Te6edf3K_IDTb4b4b4: Te6edf3mid Tff7b72or Te6edf3_msg_idTb4b4b4(Tb4b4b4)Tb4b4b4,
Te6edf3K_TSTb4b4b4: Te6edf3ts Tff7b72or Te6edf3_now_msTb4b4b4(Tb4b4b4)Tb4b4b4,
Te6edf3K_SRCTb4b4b4: Te6edf3srcTb4b4b4,
Tb4b4b4}
Tff7b72if Te6edf3room Tff7b72is Tff7b72not Tff7b72NoneTb4b4b4:
Te6edf3envTb4b4b4[Te6edf3K_ROOMTb4b4b4] Tff7b72= Te6edf3room
Tff7b72if Te6edf3body Tff7b72is Tff7b72not Tff7b72NoneTb4b4b4:
Te6edf3envTb4b4b4[Te6edf3K_BODYTb4b4b4] Tff7b72= Te6edf3body
Tff7b72if Te6edf3nick Tff7b72is Tff7b72not Tff7b72None Tff7b72and Te6edf3nick Tff7b72!= Ta5d6ff"Ta5d6ff"Tb4b4b4:
Te6edf3envTb4b4b4[Te6edf3K_NICKTb4b4b4] Tff7b72= Te6edf3nick
Tff7b72return Te6edf3env


Tff7b72class T56d364RRCMessageTb4b4b4:
Tff7b72def Tff7b72__init__Tb4b4b4(Tff7b72selfTb4b4b4, Te6edf3kindTb4b4b4, Te6edf3roomTb4b4b4, Te6edf3srcTb4b4b4, Te6edf3nickTb4b4b4, Te6edf3textTb4b4b4, Te6edf3tsTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffkind Tff7b72= Te6edf3kind
Tff7b72selfTff7b72.Td2a8ffroom Tff7b72= Te6edf3room
Tff7b72selfTff7b72.Td2a8ffsrc Tff7b72= Te6edf3src
Tff7b72selfTff7b72.Td2a8ffnick Tff7b72= Te6edf3nick
Tff7b72selfTff7b72.Td2a8fftext Tff7b72= Te6edf3text
Tff7b72selfTff7b72.Td2a8ffts Tff7b72= Te6edf3ts
Tff7b72selfTff7b72.Td2a8ffmention Tff7b72= Tff7b72False


Tff7b72class T56d364RRCHubTb4b4b4:
Te6edf3STATUS_DISCONNECTED Tff7b72= T79c0ff0
Te6edf3STATUS_CONNECTING Tff7b72= T79c0ff1
Te6edf3STATUS_CONNECTED Tff7b72= T79c0ff2
Te6edf3STATUS_FAILED Tff7b72= T79c0ff3

Te6edf3CLEAN_HISTORY_INTERVAL Tff7b72= T79c0ff5
Te6edf3SYS_NOTICE_TIMEOUT Tff7b72= T79c0ff600

Tff7b72def Tff7b72__init__Tb4b4b4(Tff7b72selfTb4b4b4, Te6edf3managerTb4b4b4, Te6edf3hub_hashTb4b4b4, Te6edf3dest_nameTff7b72=Tff7b72NoneTb4b4b4, Te6edf3nameTff7b72=Tff7b72NoneTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffmanager Tff7b72= Te6edf3manager
Tff7b72selfTff7b72.Td2a8ffhub_hash Tff7b72= Te6edf3hub_hash
Tff7b72selfTff7b72.Td2a8ffdest_name Tff7b72= Te6edf3dest_name Tff7b72or Te6edf3DEFAULT_DEST_NAME
Tff7b72selfTff7b72.Td2a8ffname Tff7b72= Te6edf3name Tff7b72or Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Te6edf3hub_hashTb4b4b4)

Tff7b72selfTff7b72.Td2a8fflink Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ffstatus Tff7b72= Te6edf3RRCHubTff7b72.Td2a8ffSTATUS_DISCONNECTED
Tff7b72selfTff7b72.Td2a8ffstatus_text Tff7b72= Ta5d6ff"Ta5d6ffDisconnectedTa5d6ff"
Tff7b72selfTff7b72.Td2a8ffwelcomed Tff7b72= Tff7b72False
Tff7b72selfTff7b72.Td2a8ffhub_name Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ffhub_version Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ffmotd Tff7b72= Tff7b72None

Tff7b72selfTff7b72.Td2a8ffmax_nick_bytes Tff7b72= Te6edf3DEFAULT_MAX_NICK_BYTES
Tff7b72selfTff7b72.Td2a8ffmax_room_name_bytes Tff7b72= Te6edf3DEFAULT_MAX_ROOM_BYTES
Tff7b72selfTff7b72.Td2a8ffmax_msg_body_bytes Tff7b72= Te6edf3DEFAULT_MAX_MSG_BYTES
Tff7b72selfTff7b72.Td2a8ffmax_rooms_per_session Tff7b72= Te6edf3DEFAULT_MAX_ROOMS
Tff7b72selfTff7b72.Td2a8ffrate_limit_msgs_per_minute Tff7b72= Te6edf3DEFAULT_RATE_PER_MINUTE

Tff7b72selfTff7b72.Td2a8ffrooms Tff7b72= Tffa657setTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffmessages Tff7b72= Tb4b4b4{Tb4b4b4}
Tff7b72selfTff7b72.Td2a8ffnotices Tff7b72= Tb4b4b4[Tb4b4b4]
Tff7b72selfTff7b72.Td2a8ffunread_rooms Tff7b72= Tffa657setTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffmention_rooms Tff7b72= Tffa657setTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffmembers Tff7b72= Tb4b4b4{Tb4b4b4}
Tff7b72selfTff7b72.Td2a8ffnicks Tff7b72= Tb4b4b4{Tb4b4b4}

Tff7b72selfTff7b72.Td2a8ffauto_reconnect Tff7b72= Tff7b72False
Tff7b72selfTff7b72.Td2a8ffauto_list Tff7b72= Tff7b72False
Tff7b72selfTff7b72.Td2a8ffauto_who Tff7b72= Tff7b72False

Tff7b72selfTff7b72.Td2a8ff_lock Tff7b72= Te6edf3threadingTff7b72.Td2a8ffRLockTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_resource_expectations Tff7b72= Tb4b4b4{Tb4b4b4}
Tff7b72selfTff7b72.Td2a8ff_sent_ids Tff7b72= Te6edf3dequeTb4b4b4(Te6edf3maxlenTff7b72=T79c0ff256Tb4b4b4)

Tff7b72selfTff7b72.Td2a8ff_hello_thread Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ff_stop_hello Tff7b72= Te6edf3threadingTff7b72.Td2a8ffEventTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_manual_disconnect Tff7b72= Tff7b72False
Tff7b72selfTff7b72.Td2a8ff_reconnect_attempts Tff7b72= T79c0ff0
Tff7b72selfTff7b72.Td2a8ff_reconnect_timer Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ff_pending_pings Tff7b72= Tb4b4b4{Tb4b4b4}
Tff7b72selfTff7b72.Td2a8ff_last_history_clean Tff7b72= T79c0ff0
Tff7b72selfTff7b72.Td2a8ffclean_last_removed Tff7b72= T79c0ff0

Tff7b72selfTff7b72.Td2a8ffavailable_rooms Tff7b72= Tb4b4b4{Tb4b4b4}
Tff7b72selfTff7b72.Td2a8ff_silent_list_pending Tff7b72= T79c0ff0
Tff7b72selfTff7b72.Td2a8ff_silent_who_rooms Tff7b72= Tffa657setTb4b4b4(Tb4b4b4)

Tff7b72selfTff7b72.Td2a8ffnick_override Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ff_pending_joins Tff7b72= Tffa657setTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_pending_parts Tff7b72= Tffa657setTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_silent_joins Tff7b72= Tffa657setTb4b4b4(Tb4b4b4)

Tff7b72selfTff7b72.Td2a8ff_history_write_failed Tff7b72= Tff7b72False

Tff7b72def Td2a8ff_logTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3msgTb4b4b4, Te6edf3levelTff7b72=Tff7b72NoneTb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3level Tff7b72is Tff7b72NoneTb4b4b4:
Te6edf3level Tff7b72= Te6edf3RNSTff7b72.Td2a8ffLOG_INFO
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ff[RRC Ta5d6ff"Tff7b72+Tff7b72selfTff7b72.Td2a8ffnameTff7b72+Ta5d6ff"Ta5d6ff] Ta5d6ff"Tff7b72+Te6edf3msgTb4b4b4, Te6edf3levelTb4b4b4)

Tff7b72def Td2a8ffadd_roomTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3roomTb4b4b4)Tb4b4b4:
Te6edf3room_n Tff7b72= Tff7b72selfTff7b72.Td2a8ff_normalize_roomTb4b4b4(Te6edf3roomTb4b4b4)
Tff7b72with Tff7b72selfTff7b72.Td2a8ff_lockTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffroomsTff7b72.Td2a8ffaddTb4b4b4(Te6edf3room_nTb4b4b4)
Tff7b72if Te6edf3room_n Tff7b72not Tff7b72in Tff7b72selfTff7b72.Td2a8ffmessagesTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffmessagesTb4b4b4[Te6edf3room_nTb4b4b4] Tff7b72= Tb4b4b4[Tb4b4b4]
Tff7b72selfTff7b72.Td2a8ffmanagerTff7b72.Td2a8ffsaveTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffmanagerTff7b72.Td2a8ff_notify_changeTb4b4b4(Tff7b72selfTb4b4b4)
Tff7b72return Te6edf3room_n

Tff7b72def Td2a8ffremove_roomTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3roomTb4b4b4)Tb4b4b4:
Te6edf3r Tff7b72= Tff7b72selfTff7b72.Td2a8ff_normalize_roomTb4b4b4(Te6edf3roomTb4b4b4)
Tff7b72with Tff7b72selfTff7b72.Td2a8ff_lockTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffroomsTff7b72.Td2a8ffdiscardTb4b4b4(Te6edf3rTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffmessagesTff7b72.Td2a8ffpopTb4b4b4(Te6edf3rTb4b4b4, Tff7b72NoneTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffunread_roomsTff7b72.Td2a8ffdiscardTb4b4b4(Te6edf3rTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffmention_roomsTff7b72.Td2a8ffdiscardTb4b4b4(Te6edf3rTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffmembersTff7b72.Td2a8ffpopTb4b4b4(Te6edf3rTb4b4b4, Tff7b72NoneTb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_delete_historyTb4b4b4(Te6edf3rTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffmanagerTff7b72.Td2a8ffsaveTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffmanagerTff7b72.Td2a8ff_notify_changeTb4b4b4(Tff7b72selfTb4b4b4)

Tff7b72def Td2a8ffclear_messagesTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3roomTb4b4b4)Tb4b4b4:
Te6edf3r Tff7b72= Tff7b72selfTff7b72.Td2a8ff_normalize_roomTb4b4b4(Te6edf3roomTb4b4b4)
Tff7b72with Tff7b72selfTff7b72.Td2a8ff_lockTb4b4b4:
Tff7b72if Te6edf3r Tff7b72in Tff7b72selfTff7b72.Td2a8ffmessagesTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffmessagesTb4b4b4[Te6edf3rTb4b4b4] Tff7b72= Tb4b4b4[Tb4b4b4]
Tff7b72selfTff7b72.Td2a8ffunread_roomsTff7b72.Td2a8ffdiscardTb4b4b4(Te6edf3rTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffmention_roomsTff7b72.Td2a8ffdiscardTb4b4b4(Te6edf3rTb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_delete_historyTb4b4b4(Te6edf3rTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffmanagerTff7b72.Td2a8ff_notify_changeTb4b4b4(Tff7b72selfTb4b4b4)

Tff7b72def Td2a8ffget_membersTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3roomTb4b4b4)Tb4b4b4:
Tff7b72with Tff7b72selfTff7b72.Td2a8ff_lockTb4b4b4:
Tff7b72return Tffa657listTb4b4b4(Tff7b72selfTff7b72.Td2a8ffmembersTff7b72.Td2a8ffgetTb4b4b4(Te6edf3roomTb4b4b4, Tffa657setTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4)

Tff7b72def Td2a8ffdisplay_name_forTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3peerTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72not Tffa657isinstanceTb4b4b4(Te6edf3peerTb4b4b4, Tb4b4b4(Tffa657bytesTb4b4b4, Tffa657bytearrayTb4b4b4)Tb4b4b4)Tb4b4b4:
Tff7b72return Ta5d6ff"Ta5d6ff<unknown>Ta5d6ff"
Te6edf3ph Tff7b72= Tffa657bytesTb4b4b4(Te6edf3peerTb4b4b4)
Tff7b72with Tff7b72selfTff7b72.Td2a8ff_lockTb4b4b4:
Te6edf3nick Tff7b72= Tff7b72selfTff7b72.Td2a8ffnicksTff7b72.Td2a8ffgetTb4b4b4(Te6edf3phTb4b4b4)
Tff7b72if Te6edf3nickTb4b4b4:
Tff7b72return Te6edf3nick
Tff7b72return Te6edf3phTff7b72.Td2a8ffhexTb4b4b4(Tb4b4b4)Tb4b4b4[Tb4b4b4:T79c0ff12Tb4b4b4]

Tff7b72def Td2a8ffmark_readTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3roomTb4b4b4)Tb4b4b4:
Te6edf3r Tff7b72= Tff7b72selfTff7b72.Td2a8ff_normalize_roomTb4b4b4(Te6edf3roomTb4b4b4)
Tff7b72with Tff7b72selfTff7b72.Td2a8ff_lockTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffunread_roomsTff7b72.Td2a8ffdiscardTb4b4b4(Te6edf3rTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffmention_roomsTff7b72.Td2a8ffdiscardTb4b4b4(Te6edf3rTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffmanagerTff7b72.Td2a8ff_notify_changeTb4b4b4(Tff7b72selfTb4b4b4)

Tff7b72def Td2a8ff_normalize_roomTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3roomTb4b4b4)Tb4b4b4:
Te6edf3r Tff7b72= Tb4b4b4(Te6edf3room Tff7b72or Ta5d6ff"Ta5d6ff"Tb4b4b4)Tff7b72.Td2a8ffstripTb4b4b4(Tb4b4b4)Tff7b72.Td2a8fflowerTb4b4b4(Tb4b4b4)
Tff7b72if Tff7b72not Te6edf3rTb4b4b4:
Tff7b72raise Tf85149ValueErrorTb4b4b4(Ta5d6ff"Ta5d6ffroom must not be emptyTa5d6ff"Tb4b4b4)
Tff7b72return Te6edf3r

Tff7b72def Td2a8ff_set_statusTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3statusTb4b4b4, Te6edf3textTff7b72=Tff7b72NoneTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffstatus Tff7b72= Te6edf3status
Tff7b72if Te6edf3text Tff7b72is Tff7b72not Tff7b72NoneTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffstatus_text Tff7b72= Te6edf3text
Tff7b72selfTff7b72.Td2a8ffmanagerTff7b72.Td2a8ff_notify_changeTb4b4b4(Tff7b72selfTb4b4b4)

Tff7b72def Td2a8ffconnectTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72with Tff7b72selfTff7b72.Td2a8ff_lockTb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffstatus Tff7b72in Tb4b4b4(Te6edf3RRCHubTff7b72.Td2a8ffSTATUS_CONNECTINGTb4b4b4, Te6edf3RRCHubTff7b72.Td2a8ffSTATUS_CONNECTEDTb4b4b4)Tb4b4b4:
Tff7b72return
Tff7b72selfTff7b72.Td2a8ff_manual_disconnect Tff7b72= Tff7b72False
Tff7b72if Tff7b72selfTff7b72.Td2a8ff_reconnect_timer Tff7b72is Tff7b72not Tff7b72NoneTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_reconnect_timerTff7b72.Td2a8ffcancelTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_reconnect_timer Tff7b72= Tff7b72None
Tff7b72if Tff7b72selfTff7b72.Td2a8ff_reconnect_attempts Tff7b72> T79c0ff0Tb4b4b4:
Te6edf3text Tff7b72= Ta5d6ff"Ta5d6ffReconnecting (attempt Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Tff7b72selfTff7b72.Td2a8ff_reconnect_attemptsTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff)Ta5d6ff"
Tff7b72elseTb4b4b4:
Te6edf3text Tff7b72= Ta5d6ff"Ta5d6ffConnectingTa5d6ff"
Tff7b72selfTff7b72.Td2a8ff_set_statusTb4b4b4(Te6edf3RRCHubTff7b72.Td2a8ffSTATUS_CONNECTINGTb4b4b4, Te6edf3textTb4b4b4)

Te6edf3t Tff7b72= Te6edf3threadingTff7b72.Td2a8ffThreadTb4b4b4(Te6edf3targetTff7b72=Tff7b72selfTff7b72.Td2a8ff_connect_workerTb4b4b4, Te6edf3daemonTff7b72=Tff7b72TrueTb4b4b4)
Te6edf3tTff7b72.Td2a8ffstartTb4b4b4(Tb4b4b4)

Tff7b72def Td2a8ff_connect_workerTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3timeout_s Tff7b72= T79c0ff20.0
Tff7b72if Tff7b72not Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8ffhas_pathTb4b4b4(Tff7b72selfTff7b72.Td2a8ffhub_hashTb4b4b4)Tb4b4b4:
Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8ffrequest_pathTb4b4b4(Tff7b72selfTff7b72.Td2a8ffhub_hashTb4b4b4)
Te6edf3deadline Tff7b72= Te6edf3timeTff7b72.Td2a8ffmonotonicTb4b4b4(Tb4b4b4) Tff7b72+ Tffa657minTb4b4b4(T79c0ff5.0Tb4b4b4, Te6edf3timeout_sTb4b4b4)
Tff7b72while Te6edf3timeTff7b72.Td2a8ffmonotonicTb4b4b4(Tb4b4b4) Tff7b72< Te6edf3deadlineTb4b4b4:
Tff7b72if Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8ffhas_pathTb4b4b4(Tff7b72selfTff7b72.Td2a8ffhub_hashTb4b4b4)Tb4b4b4:
Tff7b72break
Te6edf3timeTff7b72.Td2a8ffsleepTb4b4b4(T79c0ff0.1Tb4b4b4)

Te6edf3hub_identity Tff7b72= Tff7b72None
Te6edf3deadline Tff7b72= Te6edf3timeTff7b72.Td2a8ffmonotonicTb4b4b4(Tb4b4b4) Tff7b72+ Te6edf3timeout_s
Tff7b72while Te6edf3timeTff7b72.Td2a8ffmonotonicTb4b4b4(Tb4b4b4) Tff7b72< Te6edf3deadlineTb4b4b4:
Te6edf3hub_identity Tff7b72= Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8ffrecallTb4b4b4(Tff7b72selfTff7b72.Td2a8ffhub_hashTb4b4b4)
Tff7b72if Te6edf3hub_identity Tff7b72is Tff7b72not Tff7b72NoneTb4b4b4:
Tff7b72break
Te6edf3timeTff7b72.Td2a8ffsleepTb4b4b4(T79c0ff0.2Tb4b4b4)

Tff7b72if Te6edf3hub_identity Tff7b72is Tff7b72NoneTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_set_statusTb4b4b4(Te6edf3RRCHubTff7b72.Td2a8ffSTATUS_FAILEDTb4b4b4, Ta5d6ff"Ta5d6ffHub identity unknownTa5d6ff"Tb4b4b4)
Tff7b72return

Te6edf3app_nameTb4b4b4, Te6edf3aspects Tff7b72= Te6edf3RNSTff7b72.Td2a8ffDestinationTff7b72.Td2a8ffapp_and_aspects_from_nameTb4b4b4(Tff7b72selfTff7b72.Td2a8ffdest_nameTb4b4b4)
Te6edf3hub_dest Tff7b72= Te6edf3RNSTff7b72.Td2a8ffDestinationTb4b4b4(
Te6edf3hub_identityTb4b4b4,
Te6edf3RNSTff7b72.Td2a8ffDestinationTff7b72.Td2a8ffOUTTb4b4b4,
Te6edf3RNSTff7b72.Td2a8ffDestinationTff7b72.Td2a8ffSINGLETb4b4b4,
Te6edf3app_nameTb4b4b4,
Tff7b72*Te6edf3aspectsTb4b4b4,
Tb4b4b4)

Tff7b72if Te6edf3hub_destTff7b72.Td2a8ffhash Tff7b72!= Tff7b72selfTff7b72.Td2a8ffhub_hashTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_set_statusTb4b4b4(Te6edf3RRCHubTff7b72.Td2a8ffSTATUS_FAILEDTb4b4b4, Ta5d6ff"Ta5d6ffHash/destination name mismatchTa5d6ff"Tb4b4b4)
Tff7b72return

Tff7b72selfTff7b72.Td2a8ff_stop_helloTff7b72.Td2a8ffclearTb4b4b4(Tb4b4b4)
Te6edf3link Tff7b72= Te6edf3RNSTff7b72.Td2a8ffLinkTb4b4b4(Te6edf3hub_destTb4b4b4, Te6edf3established_callbackTff7b72=Tff7b72selfTff7b72.Td2a8ff_on_establishedTb4b4b4, Te6edf3closed_callbackTff7b72=Tff7b72selfTff7b72.Td2a8ff_on_closedTb4b4b4)
Te6edf3linkTff7b72.Td2a8ffset_packet_callbackTb4b4b4(Tff7b72lambda Te6edf3dataTb4b4b4, Te6edf3pktTb4b4b4: Tff7b72selfTff7b72.Td2a8ff_on_packetTb4b4b4(Te6edf3dataTb4b4b4)Tb4b4b4)
Tff7b72with Tff7b72selfTff7b72.Td2a8ff_lockTb4b4b4:
Tff7b72selfTff7b72.Td2a8fflink Tff7b72= Te6edf3link

Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_set_statusTb4b4b4(Te6edf3RRCHubTff7b72.Td2a8ffSTATUS_FAILEDTb4b4b4, Ta5d6ff"Ta5d6ffConnect error: Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4)

Tff7b72def Td2a8ff_on_establishedTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3linkTb4b4b4)Tb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3linkTff7b72.Td2a8ffset_resource_strategyTb4b4b4(Te6edf3RNSTff7b72.Td2a8ffLinkTff7b72.Td2a8ffACCEPT_APPTb4b4b4)
Te6edf3linkTff7b72.Td2a8ffset_resource_callbackTb4b4b4(Tff7b72selfTff7b72.Td2a8ff_resource_advertisedTb4b4b4)
Te6edf3linkTff7b72.Td2a8ffset_resource_started_callbackTb4b4b4(Tff7b72selfTff7b72.Td2a8ff_resource_advertisedTb4b4b4)
Te6edf3linkTff7b72.Td2a8ffset_resource_concluded_callbackTb4b4b4(Tff7b72selfTff7b72.Td2a8ff_resource_concludedTb4b4b4)
Tff7b72except Tf85149ExceptionTb4b4b4:
Tff7b72pass

Tff7b72tryTb4b4b4:
Te6edf3linkTff7b72.Td2a8ffidentifyTb4b4b4(Tff7b72selfTff7b72.Td2a8ffmanagerTff7b72.Td2a8ffidentityTb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_logTb4b4b4(Ta5d6ff"Ta5d6ffidentify failed: Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Tff7b72tryTb4b4b4: Te6edf3linkTff7b72.Td2a8ffteardownTb4b4b4(Tb4b4b4)
Tff7b72except Tf85149ExceptionTb4b4b4: Tff7b72pass
Tff7b72return

Tff7b72selfTff7b72.Td2a8ff_set_statusTb4b4b4(Te6edf3RRCHubTff7b72.Td2a8ffSTATUS_CONNECTINGTb4b4b4, Ta5d6ff"Ta5d6ffIdentified, sending HELLOTa5d6ff"Tb4b4b4)

Tff7b72def Td2a8ffhello_loopTb4b4b4(Tb4b4b4)Tb4b4b4:
Te6edf3attempts Tff7b72= T79c0ff0
Tff7b72while Tff7b72not Tff7b72selfTff7b72.Td2a8ff_stop_helloTff7b72.Td2a8ffis_setTb4b4b4(Tb4b4b4) Tff7b72and Tff7b72not Tff7b72selfTff7b72.Td2a8ffwelcomed Tff7b72and Te6edf3attempts Tff7b72< T79c0ff5Tb4b4b4:
Tff7b72with Tff7b72selfTff7b72.Td2a8ff_lockTb4b4b4:
Te6edf3cur_link Tff7b72= Tff7b72selfTff7b72.Td2a8fflink
Tff7b72if Te6edf3cur_link Tff7b72is Tff7b72None Tff7b72or Te6edf3cur_linkTff7b72.Td2a8ffstatus Tff7b72!= Te6edf3RNSTff7b72.Td2a8ffLinkTff7b72.Td2a8ffACTIVETb4b4b4:
Tff7b72return
Tff7b72tryTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_send_helloTb4b4b4(Te6edf3cur_linkTb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_logTb4b4b4(Ta5d6ff"Ta5d6ffHELLO send failed: Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Te6edf3attempts Tff7b72+Tff7b72= T79c0ff1
Tff7b72selfTff7b72.Td2a8ff_stop_helloTff7b72.Td2a8ffwaitTb4b4b4(Te6edf3timeoutTff7b72=T79c0ff3.0Tb4b4b4)
Tff7b72if Tff7b72not Tff7b72selfTff7b72.Td2a8ffwelcomed Tff7b72and Tff7b72not Tff7b72selfTff7b72.Td2a8ff_stop_helloTff7b72.Td2a8ffis_setTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_set_statusTb4b4b4(Te6edf3RRCHubTff7b72.Td2a8ffSTATUS_FAILEDTb4b4b4, Ta5d6ff"Ta5d6ffWELCOME timeoutTa5d6ff"Tb4b4b4)
Tff7b72tryTb4b4b4:
Tff7b72with Tff7b72selfTff7b72.Td2a8ff_lockTb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8fflink Tff7b72is Tff7b72not Tff7b72NoneTb4b4b4:
Tff7b72selfTff7b72.Td2a8fflinkTff7b72.Td2a8ffteardownTb4b4b4(Tb4b4b4)
Tff7b72except Tf85149ExceptionTb4b4b4:
Tff7b72pass

Tff7b72selfTff7b72.Td2a8ff_hello_thread Tff7b72= Te6edf3threadingTff7b72.Td2a8ffThreadTb4b4b4(Te6edf3targetTff7b72=Te6edf3hello_loopTb4b4b4, Te6edf3daemonTff7b72=Tff7b72TrueTb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_hello_threadTff7b72.Td2a8ffstartTb4b4b4(Tb4b4b4)

Tff7b72def Td2a8ff_send_helloTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3linkTb4b4b4)Tb4b4b4:
Te6edf3body Tff7b72= Tb4b4b4{
Te6edf3B_HELLO_NAMETb4b4b4: Ta5d6ff"Ta5d6ffnomadnetTa5d6ff"Tb4b4b4,
Te6edf3B_HELLO_VERTb4b4b4: Ta5d6ff"Ta5d6ff0.1Ta5d6ff"Tb4b4b4,
Te6edf3B_HELLO_CAPSTb4b4b4: Tb4b4b4{Te6edf3CAP_RESOURCE_ENVELOPETb4b4b4: Tff7b72TrueTb4b4b4}Tb4b4b4,
Tb4b4b4}
Te6edf3env Tff7b72= Te6edf3_make_envelopeTb4b4b4(Te6edf3T_HELLOTb4b4b4, Te6edf3srcTff7b72=Tff7b72selfTff7b72.Td2a8ffmanagerTff7b72.Td2a8ffidentityTff7b72.Td2a8ffhashTb4b4b4, Te6edf3bodyTff7b72=Te6edf3bodyTb4b4b4)
Te6edf3nick Tff7b72= Tff7b72selfTff7b72.Td2a8ffget_effective_nickTb4b4b4(Tb4b4b4)
Tff7b72if Te6edf3nickTb4b4b4:
Te6edf3envTb4b4b4[Te6edf3K_NICKTb4b4b4] Tff7b72= Te6edf3nick
Te6edf3payload Tff7b72= Te6edf3cborTff7b72.Td2a8ffencodeTb4b4b4(Te6edf3envTb4b4b4)
Te6edf3RNSTff7b72.Td2a8ffPacketTb4b4b4(Te6edf3linkTb4b4b4, Te6edf3payloadTb4b4b4)Tff7b72.Td2a8ffsendTb4b4b4(Tb4b4b4)

Tff7b72def Td2a8ff_on_closedTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3linkTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_stop_helloTff7b72.Td2a8ffsetTb4b4b4(Tb4b4b4)
Tff7b72with Tff7b72selfTff7b72.Td2a8ff_lockTb4b4b4:
Tff7b72selfTff7b72.Td2a8fflink Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ffwelcomed Tff7b72= Tff7b72False
Tff7b72selfTff7b72.Td2a8ffmotd Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ffmembersTff7b72.Td2a8ffclearTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_resource_expectationsTff7b72.Td2a8ffclearTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_pending_joinsTff7b72.Td2a8ffclearTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_pending_partsTff7b72.Td2a8ffclearTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_silent_joinsTff7b72.Td2a8ffclearTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_silent_who_roomsTff7b72.Td2a8ffclearTb4b4b4(Tb4b4b4)
Te6edf3should_reconnect Tff7b72= Tff7b72selfTff7b72.Td2a8ffauto_reconnect Tff7b72and Tff7b72not Tff7b72selfTff7b72.Td2a8ff_manual_disconnect
Tff7b72selfTff7b72.Td2a8ff_set_statusTb4b4b4(Te6edf3RRCHubTff7b72.Td2a8ffSTATUS_DISCONNECTEDTb4b4b4, Ta5d6ff"Ta5d6ffDisconnectedTa5d6ff"Tb4b4b4)
Tff7b72if Te6edf3should_reconnectTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_schedule_reconnectTb4b4b4(Tb4b4b4)

Tff7b72def Td2a8ff_schedule_reconnectTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72with Tff7b72selfTff7b72.Td2a8ff_lockTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_reconnect_attempts Tff7b72+Tff7b72= T79c0ff1
Te6edf3backoff Tff7b72= Tffa657minTb4b4b4(T79c0ff60.0Tb4b4b4, Tffa657maxTb4b4b4(T79c0ff1.0Tb4b4b4, T79c0ff2.0 Tff7b72*Tff7b72* Tffa657minTb4b4b4(Tff7b72selfTff7b72.Td2a8ff_reconnect_attemptsTb4b4b4, T79c0ff6Tb4b4b4)Tb4b4b4)Tb4b4b4)
Tff7b72if Tff7b72selfTff7b72.Td2a8ff_reconnect_timer Tff7b72is Tff7b72not Tff7b72NoneTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_reconnect_timerTff7b72.Td2a8ffcancelTb4b4b4(Tb4b4b4)

Tff7b72def Td2a8fffireTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72with Tff7b72selfTff7b72.Td2a8ff_lockTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_reconnect_timer Tff7b72= Tff7b72None
Tff7b72if Tff7b72selfTff7b72.Td2a8ff_manual_disconnect Tff7b72or Tff7b72not Tff7b72selfTff7b72.Td2a8ffauto_reconnectTb4b4b4:
Tff7b72return
Tff7b72selfTff7b72.Td2a8ffconnectTb4b4b4(Tb4b4b4)

Tff7b72selfTff7b72.Td2a8ff_reconnect_timer Tff7b72= Te6edf3threadingTff7b72.Td2a8ffTimerTb4b4b4(Te6edf3backoffTb4b4b4, Te6edf3fireTb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_reconnect_timerTff7b72.Td2a8ffdaemon Tff7b72= Tff7b72True
Tff7b72selfTff7b72.Td2a8ff_reconnect_timerTff7b72.Td2a8ffstartTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_set_statusTb4b4b4(Te6edf3RRCHubTff7b72.Td2a8ffSTATUS_DISCONNECTEDTb4b4b4, Ta5d6ff"Ta5d6ffReconnect in Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Tffa657intTb4b4b4(Te6edf3backoffTb4b4b4)Tb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ffsTa5d6ff"Tb4b4b4)


Tff7b72def Td2a8ffdisconnectTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_stop_helloTff7b72.Td2a8ffsetTb4b4b4(Tb4b4b4)
Tff7b72with Tff7b72selfTff7b72.Td2a8ff_lockTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_manual_disconnect Tff7b72= Tff7b72True
Tff7b72selfTff7b72.Td2a8ff_reconnect_attempts Tff7b72= T79c0ff0
Tff7b72if Tff7b72selfTff7b72.Td2a8ff_reconnect_timer Tff7b72is Tff7b72not Tff7b72NoneTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_reconnect_timerTff7b72.Td2a8ffcancelTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_reconnect_timer Tff7b72= Tff7b72None
Te6edf3link Tff7b72= Tff7b72selfTff7b72.Td2a8fflink
Tff7b72selfTff7b72.Td2a8fflink Tff7b72= Tff7b72None
Tff7b72if Te6edf3link Tff7b72is Tff7b72not Tff7b72NoneTb4b4b4:
Tff7b72tryTb4b4b4: Te6edf3linkTff7b72.Td2a8ffteardownTb4b4b4(Tb4b4b4)
Tff7b72except Tf85149ExceptionTb4b4b4: Tff7b72pass
Tff7b72selfTff7b72.Td2a8ff_set_statusTb4b4b4(Te6edf3RRCHubTff7b72.Td2a8ffSTATUS_DISCONNECTEDTb4b4b4, Ta5d6ff"Ta5d6ffDisconnectedTa5d6ff"Tb4b4b4)

Tff7b72def Td2a8ffset_auto_reconnectTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3enabledTb4b4b4, Te6edf3saveTff7b72=Tff7b72TrueTb4b4b4)Tb4b4b4:
Tff7b72with Tff7b72selfTff7b72.Td2a8ff_lockTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffauto_reconnect Tff7b72= Tffa657boolTb4b4b4(Te6edf3enabledTb4b4b4)
Tff7b72if Tff7b72not Te6edf3enabled Tff7b72and Tff7b72selfTff7b72.Td2a8ff_reconnect_timer Tff7b72is Tff7b72not Tff7b72NoneTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_reconnect_timerTff7b72.Td2a8ffcancelTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_reconnect_timer Tff7b72= Tff7b72None
Tff7b72if Te6edf3saveTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffmanagerTff7b72.Td2a8ffsaveTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffmanagerTff7b72.Td2a8ff_notify_changeTb4b4b4(Tff7b72selfTb4b4b4)

Tff7b72def Td2a8ffset_auto_listTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3enabledTb4b4b4, Te6edf3saveTff7b72=Tff7b72TrueTb4b4b4)Tb4b4b4:
Tff7b72with Tff7b72selfTff7b72.Td2a8ff_lockTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffauto_list Tff7b72= Tffa657boolTb4b4b4(Te6edf3enabledTb4b4b4)
Tff7b72if Te6edf3saveTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffmanagerTff7b72.Td2a8ffsaveTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffmanagerTff7b72.Td2a8ff_notify_changeTb4b4b4(Tff7b72selfTb4b4b4)

Tff7b72def Td2a8ffset_auto_whoTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3enabledTb4b4b4, Te6edf3saveTff7b72=Tff7b72TrueTb4b4b4)Tb4b4b4:
Tff7b72with Tff7b72selfTff7b72.Td2a8ff_lockTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffauto_who Tff7b72= Tffa657boolTb4b4b4(Te6edf3enabledTb4b4b4)
Tff7b72if Te6edf3saveTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffmanagerTff7b72.Td2a8ffsaveTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffmanagerTff7b72.Td2a8ff_notify_changeTb4b4b4(Tff7b72selfTb4b4b4)

Tff7b72def Td2a8ffget_effective_nickTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72if Tffa657isinstanceTb4b4b4(Tff7b72selfTff7b72.Td2a8ffnick_overrideTb4b4b4, Tffa657strTb4b4b4) Tff7b72and Tff7b72selfTff7b72.Td2a8ffnick_overrideTb4b4b4:
Tff7b72return Tff7b72selfTff7b72.Td2a8ffnick_override
Tff7b72return Tff7b72selfTff7b72.Td2a8ffmanagerTff7b72.Td2a8ffget_nicknameTb4b4b4(Tb4b4b4)

Tff7b72def Td2a8ffset_nick_overrideTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3nickTb4b4b4)Tb4b4b4:
Tff7b72with Tff7b72selfTff7b72.Td2a8ff_lockTb4b4b4:
Tff7b72if Te6edf3nick Tff7b72is Tff7b72None Tff7b72or Tb4b4b4(Tffa657isinstanceTb4b4b4(Te6edf3nickTb4b4b4, Tffa657strTb4b4b4) Tff7b72and Te6edf3nick Tff7b72== Ta5d6ff"Ta5d6ff"Tb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffnick_override Tff7b72= Tff7b72None
Tff7b72elseTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffnick_override Tff7b72= Tffa657strTb4b4b4(Te6edf3nickTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffmanagerTff7b72.Td2a8ffsaveTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffmanagerTff7b72.Td2a8ff_notify_changeTb4b4b4(Tff7b72selfTb4b4b4)

Tff7b72def Td2a8ff_packet_would_fitTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3linkTb4b4b4, Te6edf3payloadTb4b4b4)Tb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3pkt Tff7b72= Te6edf3RNSTff7b72.Td2a8ffPacketTb4b4b4(Te6edf3linkTb4b4b4, Te6edf3payloadTb4b4b4)
Te6edf3pktTff7b72.Td2a8ffpackTb4b4b4(Tb4b4b4)
Tff7b72return Tff7b72True
Tff7b72except Tf85149ExceptionTb4b4b4:
Tff7b72return Tff7b72False

Tff7b72def Td2a8ff_send_envTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3envTb4b4b4)Tb4b4b4:
Tff7b72with Tff7b72selfTff7b72.Td2a8ff_lockTb4b4b4:
Te6edf3link Tff7b72= Tff7b72selfTff7b72.Td2a8fflink
Tff7b72if Te6edf3link Tff7b72is Tff7b72None Tff7b72or Te6edf3linkTff7b72.Td2a8ffstatus Tff7b72!= Te6edf3RNSTff7b72.Td2a8ffLinkTff7b72.Td2a8ffACTIVETb4b4b4:
Tff7b72raise Tf85149RuntimeErrorTb4b4b4(Ta5d6ff"Ta5d6ffnot connectedTa5d6ff"Tb4b4b4)
Te6edf3payload Tff7b72= Te6edf3cborTff7b72.Td2a8ffencodeTb4b4b4(Te6edf3envTb4b4b4)
Tff7b72if Tff7b72not Tff7b72selfTff7b72.Td2a8ff_packet_would_fitTb4b4b4(Te6edf3linkTb4b4b4, Te6edf3payloadTb4b4b4)Tb4b4b4:
Tff7b72raise Tf85149RuntimeErrorTb4b4b4(Ta5d6ff"Ta5d6ffmessage exceeds link MTUTa5d6ff"Tb4b4b4)
Te6edf3RNSTff7b72.Td2a8ffPacketTb4b4b4(Te6edf3linkTb4b4b4, Te6edf3payloadTb4b4b4)Tff7b72.Td2a8ffsendTb4b4b4(Tb4b4b4)

Tff7b72def Td2a8ffjoin_roomTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3roomTb4b4b4, Te6edf3keyTff7b72=Tff7b72NoneTb4b4b4, Te6edf3silentTff7b72=Tff7b72FalseTb4b4b4)Tb4b4b4:
Te6edf3r Tff7b72= Tff7b72selfTff7b72.Td2a8ff_normalize_roomTb4b4b4(Te6edf3roomTb4b4b4)
Te6edf3body Tff7b72= Te6edf3key Tff7b72if Tb4b4b4(Tffa657isinstanceTb4b4b4(Te6edf3keyTb4b4b4, Tffa657strTb4b4b4) Tff7b72and Te6edf3keyTb4b4b4) Tff7b72else Tff7b72None
Te6edf3env Tff7b72= Te6edf3_make_envelopeTb4b4b4(Te6edf3T_JOINTb4b4b4, Te6edf3srcTff7b72=Tff7b72selfTff7b72.Td2a8ffmanagerTff7b72.Td2a8ffidentityTff7b72.Td2a8ffhashTb4b4b4, Te6edf3roomTff7b72=Te6edf3rTb4b4b4, Te6edf3bodyTff7b72=Te6edf3bodyTb4b4b4)
Te6edf3nick Tff7b72= Tff7b72selfTff7b72.Td2a8ffget_effective_nickTb4b4b4(Tb4b4b4)
Tff7b72if Te6edf3nickTb4b4b4:
Te6edf3envTb4b4b4[Te6edf3K_NICKTb4b4b4] Tff7b72= Te6edf3nick
Tff7b72with Tff7b72selfTff7b72.Td2a8ff_lockTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_pending_joinsTff7b72.Td2a8ffaddTb4b4b4(Te6edf3rTb4b4b4)
Tff7b72if Te6edf3silentTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_silent_joinsTff7b72.Td2a8ffaddTb4b4b4(Te6edf3rTb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_send_envTb4b4b4(Te6edf3envTb4b4b4)
Tff7b72with Tff7b72selfTff7b72.Td2a8ff_lockTb4b4b4:
Tff7b72if Te6edf3r Tff7b72not Tff7b72in Tff7b72selfTff7b72.Td2a8ffmessagesTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffmessagesTb4b4b4[Te6edf3rTb4b4b4] Tff7b72= Tb4b4b4[Tb4b4b4]
Tff7b72selfTff7b72.Td2a8ffmanagerTff7b72.Td2a8ff_notify_changeTb4b4b4(Tff7b72selfTb4b4b4)

Tff7b72def Td2a8ffsend_commandTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3textTb4b4b4, Te6edf3roomTff7b72=Tff7b72NoneTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72not Tffa657isinstanceTb4b4b4(Te6edf3textTb4b4b4, Tffa657strTb4b4b4) Tff7b72or Tff7b72not Te6edf3textTff7b72.Td2a8ffstartswithTb4b4b4(Ta5d6ff"Ta5d6ff/Ta5d6ff"Tb4b4b4)Tb4b4b4:
Tff7b72raise Tf85149ValueErrorTb4b4b4(Ta5d6ff"Ta5d6ffcommand must start with /Ta5d6ff"Tb4b4b4)
Te6edf3env Tff7b72= Te6edf3_make_envelopeTb4b4b4(Te6edf3T_MSGTb4b4b4, Te6edf3srcTff7b72=Tff7b72selfTff7b72.Td2a8ffmanagerTff7b72.Td2a8ffidentityTff7b72.Td2a8ffhashTb4b4b4, Te6edf3roomTff7b72=Te6edf3roomTb4b4b4, Te6edf3bodyTff7b72=Te6edf3textTb4b4b4)
Te6edf3nick Tff7b72= Tff7b72selfTff7b72.Td2a8ffget_effective_nickTb4b4b4(Tb4b4b4)
Tff7b72if Te6edf3nickTb4b4b4:
Te6edf3envTb4b4b4[Te6edf3K_NICKTb4b4b4] Tff7b72= Te6edf3nick
Tff7b72selfTff7b72.Td2a8ff_send_envTb4b4b4(Te6edf3envTb4b4b4)

Tff7b72def Td2a8ffsend_pingTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3roomTff7b72=Tff7b72NoneTb4b4b4)Tb4b4b4:
Te6edf3body Tff7b72= Te6edf3osTff7b72.Td2a8ffurandomTb4b4b4(T79c0ff8Tb4b4b4)
Te6edf3env Tff7b72= Te6edf3_make_envelopeTb4b4b4(Te6edf3T_PINGTb4b4b4, Te6edf3srcTff7b72=Tff7b72selfTff7b72.Td2a8ffmanagerTff7b72.Td2a8ffidentityTff7b72.Td2a8ffhashTb4b4b4, Te6edf3bodyTff7b72=Te6edf3bodyTb4b4b4)
Tff7b72with Tff7b72selfTff7b72.Td2a8ff_lockTb4b4b4:
Te6edf3now_ms Tff7b72= Te6edf3_now_msTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_pending_pingsTb4b4b4[Te6edf3bodyTb4b4b4] Tff7b72= Tb4b4b4(Te6edf3now_msTb4b4b4, Te6edf3roomTb4b4b4)
Te6edf3expired Tff7b72= Tb4b4b4[Te6edf3k Tff7b72for Te6edf3kTb4b4b4, Te6edf3v Tff7b72in Tff7b72selfTff7b72.Td2a8ff_pending_pingsTff7b72.Td2a8ffitemsTb4b4b4(Tb4b4b4) Tff7b72if Te6edf3now_ms Tff7b72- Te6edf3vTb4b4b4[T79c0ff0Tb4b4b4] Tff7b72> T79c0ff15000Tb4b4b4]
Tff7b72for Te6edf3k Tff7b72in Te6edf3expiredTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_pending_pingsTff7b72.Td2a8ffpopTb4b4b4(Te6edf3kTb4b4b4, Tff7b72NoneTb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_send_envTb4b4b4(Te6edf3envTb4b4b4)
Tff7b72return Te6edf3body

Tff7b72def Td2a8ffpart_roomTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3roomTb4b4b4)Tb4b4b4:
Te6edf3room_n Tff7b72= Tff7b72selfTff7b72.Td2a8ff_normalize_roomTb4b4b4(Te6edf3roomTb4b4b4)
Te6edf3env Tff7b72= Te6edf3_make_envelopeTb4b4b4(Te6edf3T_PARTTb4b4b4, Te6edf3srcTff7b72=Tff7b72selfTff7b72.Td2a8ffmanagerTff7b72.Td2a8ffidentityTff7b72.Td2a8ffhashTb4b4b4, Te6edf3roomTff7b72=Te6edf3room_nTb4b4b4)
Tff7b72with Tff7b72selfTff7b72.Td2a8ff_lockTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_pending_partsTff7b72.Td2a8ffaddTb4b4b4(Te6edf3room_nTb4b4b4)
Tff7b72tryTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_send_envTb4b4b4(Te6edf3envTb4b4b4)
Tff7b72except Tf85149ExceptionTb4b4b4:
Tff7b72pass
Tff7b72with Tff7b72selfTff7b72.Td2a8ff_lockTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffroomsTff7b72.Td2a8ffdiscardTb4b4b4(Te6edf3room_nTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffmanagerTff7b72.Td2a8ffsaveTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffmanagerTff7b72.Td2a8ff_notify_changeTb4b4b4(Tff7b72selfTb4b4b4)

Tff7b72def Td2a8ffsend_messageTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3roomTb4b4b4, Te6edf3textTb4b4b4)Tb4b4b4:
Te6edf3r Tff7b72= Tff7b72selfTff7b72.Td2a8ff_normalize_roomTb4b4b4(Te6edf3roomTb4b4b4)
Tff7b72if Tff7b72not Tffa657isinstanceTb4b4b4(Te6edf3textTb4b4b4, Tffa657strTb4b4b4) Tff7b72or Tff7b72not Te6edf3textTff7b72.Td2a8ffstripTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72raise Tf85149ValueErrorTb4b4b4(Ta5d6ff"Ta5d6ffmessage text must be non-emptyTa5d6ff"Tb4b4b4)
Tff7b72if Tffa657lenTb4b4b4(Te6edf3textTff7b72.Td2a8ffencodeTb4b4b4(Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4)Tb4b4b4) Tff7b72> Tff7b72selfTff7b72.Td2a8ffmax_msg_body_bytesTb4b4b4:
Tff7b72raise Tf85149ValueErrorTb4b4b4(Ta5d6ff"Ta5d6ffmessage too long for hub limitTa5d6ff"Tb4b4b4)
Te6edf3env Tff7b72= Te6edf3_make_envelopeTb4b4b4(Te6edf3T_MSGTb4b4b4, Te6edf3srcTff7b72=Tff7b72selfTff7b72.Td2a8ffmanagerTff7b72.Td2a8ffidentityTff7b72.Td2a8ffhashTb4b4b4, Te6edf3roomTff7b72=Te6edf3rTb4b4b4, Te6edf3bodyTff7b72=Te6edf3textTb4b4b4)
Te6edf3nick Tff7b72= Tff7b72selfTff7b72.Td2a8ffget_effective_nickTb4b4b4(Tb4b4b4)
Tff7b72if Te6edf3nickTb4b4b4:
Te6edf3envTb4b4b4[Te6edf3K_NICKTb4b4b4] Tff7b72= Te6edf3nick
Te6edf3mid Tff7b72= Te6edf3envTb4b4b4[Te6edf3K_IDTb4b4b4]
Tff7b72if Tffa657isinstanceTb4b4b4(Te6edf3midTb4b4b4, Tb4b4b4(Tffa657bytesTb4b4b4, Tffa657bytearrayTb4b4b4)Tb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_sent_idsTff7b72.Td2a8ffappendTb4b4b4(Tffa657bytesTb4b4b4(Te6edf3midTb4b4b4)Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_send_envTb4b4b4(Te6edf3envTb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_record_messageTb4b4b4(Te6edf3RRCMessageTb4b4b4(Ta5d6ff"Ta5d6ffmsgTa5d6ff"Tb4b4b4, Te6edf3rTb4b4b4, Tff7b72selfTff7b72.Td2a8ffmanagerTff7b72.Td2a8ffidentityTff7b72.Td2a8ffhashTb4b4b4, Te6edf3nickTb4b4b4, Te6edf3textTb4b4b4, Te6edf3_now_msTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4, Te6edf3localTff7b72=Tff7b72TrueTb4b4b4)
Tff7b72return Te6edf3mid

Tff7b72def Td2a8ff_per_room_capTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3v Tff7b72= Tffa657intTb4b4b4(Tffa657getattrTb4b4b4(Tff7b72selfTff7b72.Td2a8ffmanagerTff7b72.Td2a8ffappTb4b4b4, Ta5d6ff"Ta5d6ffrrc_history_per_room_capTa5d6ff"Tb4b4b4, T79c0ff0Tb4b4b4)Tb4b4b4)
Tff7b72except Tf85149ExceptionTb4b4b4:
Tff7b72return Tff7b72None
Tff7b72return Te6edf3v Tff7b72if Te6edf3v Tff7b72> T79c0ff0 Tff7b72else Tff7b72None

Tff7b72def Td2a8ff_filter_historyTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72tryTb4b4b4: Te6edf3v Tff7b72= Tffa657getattrTb4b4b4(Tff7b72selfTff7b72.Td2a8ffmanagerTff7b72.Td2a8ffappTb4b4b4, Ta5d6ff"Ta5d6ffrrc_filter_loaded_historyTa5d6ff"Tb4b4b4, Tff7b72TrueTb4b4b4)
Tff7b72except Tf85149ExceptionTb4b4b4: Tff7b72return Tff7b72True
Tff7b72return Te6edf3v

Tff7b72def Td2a8ff_ephemeral_notices_historyTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72tryTb4b4b4: Te6edf3v Tff7b72= Tffa657getattrTb4b4b4(Tff7b72selfTff7b72.Td2a8ffmanagerTff7b72.Td2a8ffappTb4b4b4, Ta5d6ff"Ta5d6ffrrc_ephemeral_noticesTa5d6ff"Tb4b4b4, Tff7b72selfTff7b72.Td2a8ffSYS_NOTICE_TIMEOUTTb4b4b4)
Tff7b72except Tf85149ExceptionTb4b4b4: Tff7b72return Tff7b72selfTff7b72.Td2a8ffSYS_NOTICE_TIMEOUT
Tff7b72return Te6edf3v

Tff7b72def Td2a8ff_entry_forTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3msgTb4b4b4)Tb4b4b4:
Tff7b72return Tb4b4b4{
Te6edf3H_KINDTb4b4b4: Te6edf3msgTff7b72.Td2a8ffkindTb4b4b4,
Te6edf3H_SRCTb4b4b4: Tffa657bytesTb4b4b4(Te6edf3msgTff7b72.Td2a8ffsrcTb4b4b4) Tff7b72if Tffa657isinstanceTb4b4b4(Te6edf3msgTff7b72.Td2a8ffsrcTb4b4b4, Tb4b4b4(Tffa657bytesTb4b4b4, Tffa657bytearrayTb4b4b4)Tb4b4b4) Tff7b72else Tff7b72NoneTb4b4b4,
Te6edf3H_NICKTb4b4b4: Te6edf3msgTff7b72.Td2a8ffnick Tff7b72if Tffa657isinstanceTb4b4b4(Te6edf3msgTff7b72.Td2a8ffnickTb4b4b4, Tffa657strTb4b4b4) Tff7b72else Tff7b72NoneTb4b4b4,
Te6edf3H_TEXTTb4b4b4: Te6edf3msgTff7b72.Td2a8fftext Tff7b72if Tffa657isinstanceTb4b4b4(Te6edf3msgTff7b72.Td2a8fftextTb4b4b4, Tffa657strTb4b4b4) Tff7b72else Ta5d6ff"Ta5d6ff"Tb4b4b4,
Te6edf3H_TSTb4b4b4: Tffa657intTb4b4b4(Te6edf3msgTff7b72.Td2a8fftsTb4b4b4) Tff7b72if Tffa657isinstanceTb4b4b4(Te6edf3msgTff7b72.Td2a8fftsTb4b4b4, Tffa657intTb4b4b4) Tff7b72else Te6edf3_now_msTb4b4b4(Tb4b4b4)Tb4b4b4,
Te6edf3H_MENTIONTb4b4b4: Tffa657boolTb4b4b4(Tffa657getattrTb4b4b4(Te6edf3msgTb4b4b4, Ta5d6ff"Ta5d6ffmentionTa5d6ff"Tb4b4b4, Tff7b72FalseTb4b4b4)Tb4b4b4)Tb4b4b4,
Tb4b4b4}

Tff7b72def Td2a8ff_msg_from_entryTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3roomTb4b4b4, Te6edf3entryTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72not Tffa657isinstanceTb4b4b4(Te6edf3entryTb4b4b4, Tffa657dictTb4b4b4)Tb4b4b4:
Tff7b72return Tff7b72None
Te6edf3m Tff7b72= Te6edf3RRCMessageTb4b4b4(
Te6edf3entryTff7b72.Td2a8ffgetTb4b4b4(Te6edf3H_KINDTb4b4b4) Tff7b72if Tffa657isinstanceTb4b4b4(Te6edf3entryTff7b72.Td2a8ffgetTb4b4b4(Te6edf3H_KINDTb4b4b4)Tb4b4b4, Tffa657strTb4b4b4) Tff7b72else Ta5d6ff"Ta5d6ffmsgTa5d6ff"Tb4b4b4,
Te6edf3roomTb4b4b4,
Te6edf3entryTff7b72.Td2a8ffgetTb4b4b4(Te6edf3H_SRCTb4b4b4) Tff7b72if Tffa657isinstanceTb4b4b4(Te6edf3entryTff7b72.Td2a8ffgetTb4b4b4(Te6edf3H_SRCTb4b4b4)Tb4b4b4, Tb4b4b4(Tffa657bytesTb4b4b4, Tffa657bytearrayTb4b4b4)Tb4b4b4) Tff7b72else Tff7b72NoneTb4b4b4,
Te6edf3entryTff7b72.Td2a8ffgetTb4b4b4(Te6edf3H_NICKTb4b4b4) Tff7b72if Tffa657isinstanceTb4b4b4(Te6edf3entryTff7b72.Td2a8ffgetTb4b4b4(Te6edf3H_NICKTb4b4b4)Tb4b4b4, Tffa657strTb4b4b4) Tff7b72else Tff7b72NoneTb4b4b4,
Te6edf3entryTff7b72.Td2a8ffgetTb4b4b4(Te6edf3H_TEXTTb4b4b4) Tff7b72if Tffa657isinstanceTb4b4b4(Te6edf3entryTff7b72.Td2a8ffgetTb4b4b4(Te6edf3H_TEXTTb4b4b4)Tb4b4b4, Tffa657strTb4b4b4) Tff7b72else Ta5d6ff"Ta5d6ff"Tb4b4b4,
Te6edf3entryTff7b72.Td2a8ffgetTb4b4b4(Te6edf3H_TSTb4b4b4) Tff7b72if Tffa657isinstanceTb4b4b4(Te6edf3entryTff7b72.Td2a8ffgetTb4b4b4(Te6edf3H_TSTb4b4b4)Tb4b4b4, Tffa657intTb4b4b4) Tff7b72else T79c0ff0Tb4b4b4,
Tb4b4b4)
Te6edf3mTff7b72.Td2a8ffmention Tff7b72= Tffa657boolTb4b4b4(Te6edf3entryTff7b72.Td2a8ffgetTb4b4b4(Te6edf3H_MENTIONTb4b4b4, Tff7b72FalseTb4b4b4)Tb4b4b4)
Tff7b72return Te6edf3m

Tff7b72def Td2a8ff_persistable_roomTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3roomTb4b4b4)Tb4b4b4:
Tff7b72return Tffa657isinstanceTb4b4b4(Te6edf3roomTb4b4b4, Tffa657strTb4b4b4) Tff7b72and Te6edf3room Tff7b72and Te6edf3room Tff7b72!= Ta5d6ff"Ta5d6ff*Ta5d6ff"

Tff7b72def Td2a8ff_append_historyTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3roomTb4b4b4, Te6edf3msgTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72not Tff7b72selfTff7b72.Td2a8ff_persistable_roomTb4b4b4(Te6edf3roomTb4b4b4)Tb4b4b4:
Tff7b72return
Tff7b72tryTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffmanagerTff7b72.Td2a8ff_ensure_history_dirTb4b4b4(Tff7b72selfTb4b4b4)
Te6edf3path Tff7b72= Tff7b72selfTff7b72.Td2a8ffmanagerTff7b72.Td2a8ff_history_pathTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3roomTb4b4b4)
Tff7b72with Tffa657openTb4b4b4(Te6edf3pathTb4b4b4, Ta5d6ff"Ta5d6ffabTa5d6ff"Tb4b4b4) Tff7b72as Te6edf3fTb4b4b4:
Te6edf3fTff7b72.Td2a8ffwriteTb4b4b4(Te6edf3cborTff7b72.Td2a8ffencodeTb4b4b4(Tff7b72selfTff7b72.Td2a8ff_entry_forTb4b4b4(Te6edf3msgTb4b4b4)Tb4b4b4)Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_history_write_failed Tff7b72= Tff7b72False
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Tff7b72if Tff7b72not Tff7b72selfTff7b72.Td2a8ff_history_write_failedTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_history_write_failed Tff7b72= Tff7b72True
Tff7b72selfTff7b72.Td2a8ff_logTb4b4b4(Ta5d6ff"Ta5d6ffhistory persistence failed, suppressing further warnings until recovery: Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)

Tff7b72def Td2a8ff_delete_historyTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3roomTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72not Tff7b72selfTff7b72.Td2a8ff_persistable_roomTb4b4b4(Te6edf3roomTb4b4b4)Tb4b4b4:
Tff7b72return
Te6edf3path Tff7b72= Tff7b72selfTff7b72.Td2a8ffmanagerTff7b72.Td2a8ff_history_pathTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3roomTb4b4b4)
Tff7b72tryTb4b4b4:
Tff7b72if Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisfileTb4b4b4(Te6edf3pathTb4b4b4)Tb4b4b4:
Te6edf3osTff7b72.Td2a8ffunlinkTb4b4b4(Te6edf3pathTb4b4b4)
Tff7b72except Tf85149ExceptionTb4b4b4:
Tff7b72pass

Tff7b72def Td2a8ff_load_historyTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72with Tff7b72selfTff7b72.Td2a8ff_lockTb4b4b4:
Te6edf3rooms Tff7b72= Tffa657listTb4b4b4(Tff7b72selfTff7b72.Td2a8ffmessagesTff7b72.Td2a8ffkeysTb4b4b4(Tb4b4b4)Tb4b4b4)
Tff7b72for Te6edf3room Tff7b72in Te6edf3roomsTb4b4b4:
Tff7b72if Tff7b72not Tff7b72selfTff7b72.Td2a8ff_persistable_roomTb4b4b4(Te6edf3roomTb4b4b4)Tb4b4b4:
Tff7b72continue
Te6edf3path Tff7b72= Tff7b72selfTff7b72.Td2a8ffmanagerTff7b72.Td2a8ff_history_pathTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3roomTb4b4b4)
Tff7b72if Tff7b72not Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisfileTb4b4b4(Te6edf3pathTb4b4b4)Tb4b4b4:
Tff7b72continue
Te6edf3window Tff7b72= Te6edf3dequeTb4b4b4(Te6edf3maxlenTff7b72=Tff7b72selfTff7b72.Td2a8ff_per_room_capTb4b4b4(Tb4b4b4)Tb4b4b4)
Te6edf3decode_error Tff7b72= Tff7b72None
Tff7b72tryTb4b4b4:
Tff7b72with Tffa657openTb4b4b4(Te6edf3pathTb4b4b4, Ta5d6ff"Ta5d6ffrbTa5d6ff"Tb4b4b4) Tff7b72as Te6edf3fTb4b4b4:
Tff7b72while Tff7b72TrueTb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3windowTff7b72.Td2a8ffappendTb4b4b4(Te6edf3cborTff7b72.Td2a8ffloadTb4b4b4(Te6edf3fTb4b4b4)Tb4b4b4)
Tff7b72except Tf85149EOFErrorTb4b4b4:
Tff7b72break
Tff7b72except Tf85149Exception Tff7b72as Te6edf3exTb4b4b4:
Te6edf3decode_error Tff7b72= Te6edf3ex
Tff7b72break
Tff7b72except Tf85149OSError Tff7b72as Te6edf3exTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_logTb4b4b4(Ta5d6ff"Ta5d6ffhistory load failed for #Ta5d6ff"Tff7b72+Te6edf3roomTff7b72+Ta5d6ff"Ta5d6ff: Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3exTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Tff7b72continue
Tff7b72if Te6edf3decode_error Tff7b72is Tff7b72not Tff7b72NoneTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_logTb4b4b4(Ta5d6ff"Ta5d6ffhistory file for #Ta5d6ff"Tff7b72+Te6edf3roomTff7b72+Ta5d6ff"Ta5d6ff is corrupt, truncating to last Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Tffa657lenTb4b4b4(Te6edf3windowTb4b4b4)Tb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff valid messages: Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3decode_errorTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Te6edf3msgs Tff7b72= Tb4b4b4[Tb4b4b4]
Te6edf3filter_msgs Tff7b72= Tff7b72selfTff7b72.Td2a8ff_filter_historyTb4b4b4(Tb4b4b4)
Tff7b72for Te6edf3e Tff7b72in Te6edf3windowTb4b4b4:
Te6edf3m Tff7b72= Tff7b72selfTff7b72.Td2a8ff_msg_from_entryTb4b4b4(Te6edf3roomTb4b4b4, Te6edf3eTb4b4b4)
Tff7b72if Te6edf3m Tff7b72is Tff7b72not Tff7b72NoneTb4b4b4:
Tff7b72if Te6edf3filter_msgsTb4b4b4:
Te6edf3should_filter Tff7b72= Tff7b72False
Tff7b72if Te6edf3mTff7b72.Td2a8ffkind Tff7b72== Ta5d6ff"Ta5d6ffsystemTa5d6ff"Tb4b4b4: Te6edf3should_filter Tff7b72= Tff7b72True
Tff7b72elif Te6edf3mTff7b72.Td2a8ffkind Tff7b72== Ta5d6ff"Ta5d6ffnoticeTa5d6ff"Tb4b4b4: Te6edf3should_filter Tff7b72= Tff7b72True
Tff7b72if Te6edf3should_filterTb4b4b4: Tff7b72continue

Te6edf3msgsTff7b72.Td2a8ffappendTb4b4b4(Te6edf3mTb4b4b4)
Tff7b72with Tff7b72selfTff7b72.Td2a8ff_lockTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffmessagesTb4b4b4[Te6edf3roomTb4b4b4] Tff7b72= Te6edf3msgs

Tff7b72def Td2a8ff_clean_historyTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Te6edf3now Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)
Te6edf3cleaned Tff7b72= Tff7b72False
Te6edf3remove_after Tff7b72= Tff7b72selfTff7b72.Td2a8ff_ephemeral_notices_historyTb4b4b4(Tb4b4b4)
Tff7b72if Te6edf3now Tff7b72> Tff7b72selfTff7b72.Td2a8ff_last_history_clean Tff7b72+ Tff7b72selfTff7b72.Td2a8ffCLEAN_HISTORY_INTERVALTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffCleaning loaded message historyTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
Tff7b72with Tff7b72selfTff7b72.Td2a8ff_lockTb4b4b4:
Tff7b72tryTb4b4b4:
Tff7b72for Te6edf3r Tff7b72in Tff7b72selfTff7b72.Td2a8ffmessagesTb4b4b4:
Te6edf3old Tff7b72= Tffa657setTb4b4b4(Tb4b4b4)
Tff7b72for Te6edf3m Tff7b72in Tff7b72selfTff7b72.Td2a8ffmessagesTb4b4b4[Te6edf3rTb4b4b4]Tb4b4b4:
Te6edf3age Tff7b72= Te6edf3nowTff7b72-Te6edf3mTff7b72.Td2a8fftsTff7b72/T79c0ff1000.0
Te6edf3should_filter Tff7b72= Tff7b72False
Tff7b72if Te6edf3mTff7b72.Td2a8ffkind Tff7b72== Ta5d6ff"Ta5d6ffsystemTa5d6ff"Tb4b4b4: Te6edf3should_filter Tff7b72= Tff7b72True
Tff7b72elif Te6edf3mTff7b72.Td2a8ffkind Tff7b72== Ta5d6ff"Ta5d6ffnoticeTa5d6ff"Tb4b4b4: Te6edf3should_filter Tff7b72= Tff7b72True
Tff7b72if Te6edf3should_filter Tff7b72and Te6edf3age Tff7b72> Te6edf3remove_afterTb4b4b4: Te6edf3oldTff7b72.Td2a8ffaddTb4b4b4(Te6edf3mTb4b4b4)

Tff7b72for Te6edf3m Tff7b72in Te6edf3oldTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffmessagesTb4b4b4[Te6edf3rTb4b4b4]Tff7b72.Td2a8ffremoveTb4b4b4(Te6edf3mTb4b4b4)
Te6edf3cleaned Tff7b72= Tff7b72True

Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4: Te6edf3RNSTff7b72.Td2a8fftrace_exceptionTb4b4b4(Te6edf3eTb4b4b4)

Tff7b72selfTff7b72.Td2a8ff_last_history_clean Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)
Tff7b72if Te6edf3cleanedTb4b4b4: Tff7b72selfTff7b72.Td2a8ffclean_last_removed Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)

Tff7b72def Td2a8ff_record_messageTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3msgTb4b4b4, Te6edf3localTff7b72=Tff7b72FalseTb4b4b4)Tb4b4b4:
Te6edf3cap Tff7b72= Tff7b72selfTff7b72.Td2a8ff_per_room_capTb4b4b4(Tb4b4b4)
Tff7b72with Tff7b72selfTff7b72.Td2a8ff_lockTb4b4b4:
Te6edf3buf Tff7b72= Tff7b72selfTff7b72.Td2a8ffmessagesTff7b72.Td2a8ffsetdefaultTb4b4b4(Te6edf3msgTff7b72.Td2a8ffroom Tff7b72or Ta5d6ff"Ta5d6ff*Ta5d6ff"Tb4b4b4, Tb4b4b4[Tb4b4b4]Tb4b4b4)
Te6edf3bufTff7b72.Td2a8ffappendTb4b4b4(Te6edf3msgTb4b4b4)
Tff7b72if Te6edf3cap Tff7b72is Tff7b72not Tff7b72None Tff7b72and Tffa657lenTb4b4b4(Te6edf3bufTb4b4b4) Tff7b72> Te6edf3capTb4b4b4:
Tff7b72del Te6edf3bufTb4b4b4[Tb4b4b4:Tffa657lenTb4b4b4(Te6edf3bufTb4b4b4)Tff7b72-Te6edf3capTb4b4b4]
Tff7b72if Tff7b72not Te6edf3local Tff7b72and Te6edf3msgTff7b72.Td2a8ffroomTb4b4b4:
Tff7b72if Te6edf3msgTff7b72.Td2a8ffroom Tff7b72!= Tff7b72selfTff7b72.Td2a8ffmanagerTff7b72.Td2a8ffactive_room_forTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffunread_roomsTff7b72.Td2a8ffaddTb4b4b4(Te6edf3msgTff7b72.Td2a8ffroomTb4b4b4)
Tff7b72if Te6edf3msgTff7b72.Td2a8ffmentionTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffmention_roomsTff7b72.Td2a8ffaddTb4b4b4(Te6edf3msgTff7b72.Td2a8ffroomTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffmanagerTff7b72.Td2a8ff_notify_messagesTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3msgTb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_append_historyTb4b4b4(Te6edf3msgTff7b72.Td2a8ffroomTb4b4b4, Te6edf3msgTb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_clean_historyTb4b4b4(Tb4b4b4)

Tff7b72def Td2a8ff_record_systemTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3roomTb4b4b4, Te6edf3textTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72not Te6edf3roomTb4b4b4:
Tff7b72return
Te6edf3msg Tff7b72= Te6edf3RRCMessageTb4b4b4(Ta5d6ff"Ta5d6ffsystemTa5d6ff"Tb4b4b4, Te6edf3roomTb4b4b4, Tff7b72NoneTb4b4b4, Tff7b72NoneTb4b4b4, Te6edf3textTb4b4b4, Te6edf3_now_msTb4b4b4(Tb4b4b4)Tb4b4b4)
Te6edf3cap Tff7b72= Tff7b72selfTff7b72.Td2a8ff_per_room_capTb4b4b4(Tb4b4b4)
Tff7b72with Tff7b72selfTff7b72.Td2a8ff_lockTb4b4b4:
Te6edf3buf Tff7b72= Tff7b72selfTff7b72.Td2a8ffmessagesTff7b72.Td2a8ffsetdefaultTb4b4b4(Te6edf3roomTb4b4b4, Tb4b4b4[Tb4b4b4]Tb4b4b4)
Te6edf3bufTff7b72.Td2a8ffappendTb4b4b4(Te6edf3msgTb4b4b4)
Tff7b72if Te6edf3cap Tff7b72is Tff7b72not Tff7b72None Tff7b72and Tffa657lenTb4b4b4(Te6edf3bufTb4b4b4) Tff7b72> Te6edf3capTb4b4b4:
Tff7b72del Te6edf3bufTb4b4b4[Tb4b4b4:Tffa657lenTb4b4b4(Te6edf3bufTb4b4b4)Tff7b72-Te6edf3capTb4b4b4]
Tff7b72selfTff7b72.Td2a8ffmanagerTff7b72.Td2a8ff_notify_messagesTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3msgTb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_append_historyTb4b4b4(Te6edf3roomTb4b4b4, Te6edf3msgTb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_clean_historyTb4b4b4(Tb4b4b4)

Tff7b72def Td2a8ff_record_noticeTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3msgTb4b4b4)Tb4b4b4:
Te6edf3target_room Tff7b72= Te6edf3msgTff7b72.Td2a8ffroom
Tff7b72if Tff7b72not Te6edf3target_roomTb4b4b4:
Te6edf3target_room Tff7b72= Tff7b72selfTff7b72.Td2a8ffmanagerTff7b72.Td2a8ffactive_room_forTb4b4b4(Tff7b72selfTb4b4b4)
Tff7b72if Te6edf3target_roomTb4b4b4:
Te6edf3msgTff7b72.Td2a8ffroom Tff7b72= Te6edf3target_room

Te6edf3cap Tff7b72= Tff7b72selfTff7b72.Td2a8ff_per_room_capTb4b4b4(Tb4b4b4)
Tff7b72with Tff7b72selfTff7b72.Td2a8ff_lockTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffnoticesTff7b72.Td2a8ffappendTb4b4b4(Te6edf3msgTb4b4b4)
Tff7b72if Tffa657lenTb4b4b4(Tff7b72selfTff7b72.Td2a8ffnoticesTb4b4b4) Tff7b72> T79c0ff200Tb4b4b4:
Tff7b72del Tff7b72selfTff7b72.Td2a8ffnoticesTb4b4b4[Tb4b4b4:Tffa657lenTb4b4b4(Tff7b72selfTff7b72.Td2a8ffnoticesTb4b4b4)Tff7b72-T79c0ff200Tb4b4b4]
Tff7b72if Te6edf3target_roomTb4b4b4:
Te6edf3buf Tff7b72= Tff7b72selfTff7b72.Td2a8ffmessagesTff7b72.Td2a8ffsetdefaultTb4b4b4(Te6edf3target_roomTb4b4b4, Tb4b4b4[Tb4b4b4]Tb4b4b4)
Te6edf3bufTff7b72.Td2a8ffappendTb4b4b4(Te6edf3msgTb4b4b4)
Tff7b72if Te6edf3cap Tff7b72is Tff7b72not Tff7b72None Tff7b72and Tffa657lenTb4b4b4(Te6edf3bufTb4b4b4) Tff7b72> Te6edf3capTb4b4b4:
Tff7b72del Te6edf3bufTb4b4b4[Tb4b4b4:Tffa657lenTb4b4b4(Te6edf3bufTb4b4b4)Tff7b72-Te6edf3capTb4b4b4]
Tff7b72if Te6edf3target_room Tff7b72!= Tff7b72selfTff7b72.Td2a8ffmanagerTff7b72.Td2a8ffactive_room_forTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffunread_roomsTff7b72.Td2a8ffaddTb4b4b4(Te6edf3target_roomTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffmanagerTff7b72.Td2a8ff_notify_messagesTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3msgTb4b4b4)
Tff7b72if Te6edf3target_roomTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_append_historyTb4b4b4(Te6edf3target_roomTb4b4b4, Te6edf3msgTb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_clean_historyTb4b4b4(Tb4b4b4)

Tff7b72def Td2a8ffget_messagesTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3roomTb4b4b4, Te6edf3take_lockTff7b72=Tff7b72TrueTb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3take_lockTb4b4b4:
Tff7b72with Tff7b72selfTff7b72.Td2a8ff_lockTb4b4b4: Te6edf3buf Tff7b72= Tffa657listTb4b4b4(Tff7b72selfTff7b72.Td2a8ffmessagesTff7b72.Td2a8ffgetTb4b4b4(Te6edf3roomTb4b4b4, Tb4b4b4[Tb4b4b4]Tb4b4b4)Tb4b4b4)
Tff7b72elseTb4b4b4: Te6edf3buf Tff7b72= Tffa657listTb4b4b4(Tff7b72selfTff7b72.Td2a8ffmessagesTff7b72.Td2a8ffgetTb4b4b4(Te6edf3roomTb4b4b4, Tb4b4b4[Tb4b4b4]Tb4b4b4)Tb4b4b4)

Tff7b72return Te6edf3buf

Tff7b72def Td2a8ff_on_packetTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3dataTb4b4b4)Tb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3env Tff7b72= Te6edf3cborTff7b72.Td2a8ffdecodeTb4b4b4(Te6edf3dataTb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_logTb4b4b4(Ta5d6ff"Ta5d6ffdecode failed: Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
Tff7b72return
Tff7b72if Tff7b72not Tffa657isinstanceTb4b4b4(Te6edf3envTb4b4b4, Tffa657dictTb4b4b4)Tb4b4b4:
Tff7b72return
Tff7b72tryTb4b4b4:
Te6edf3t Tff7b72= Te6edf3envTff7b72.Td2a8ffgetTb4b4b4(Te6edf3K_TTb4b4b4)
Tff7b72except Tf85149ExceptionTb4b4b4:
Tff7b72return

Tff7b72if Te6edf3t Tff7b72== Te6edf3T_PINGTb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3pong Tff7b72= Te6edf3_make_envelopeTb4b4b4(Te6edf3T_PONGTb4b4b4, Te6edf3srcTff7b72=Tff7b72selfTff7b72.Td2a8ffmanagerTff7b72.Td2a8ffidentityTff7b72.Td2a8ffhashTb4b4b4, Te6edf3bodyTff7b72=Te6edf3envTff7b72.Td2a8ffgetTb4b4b4(Te6edf3K_BODYTb4b4b4)Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_send_envTb4b4b4(Te6edf3pongTb4b4b4)
Tff7b72except Tf85149ExceptionTb4b4b4:
Tff7b72pass
Tff7b72return

Tff7b72if Te6edf3t Tff7b72== Te6edf3T_PONGTb4b4b4:
Te6edf3body Tff7b72= Te6edf3envTff7b72.Td2a8ffgetTb4b4b4(Te6edf3K_BODYTb4b4b4)
Tff7b72if Tffa657isinstanceTb4b4b4(Te6edf3bodyTb4b4b4, Tb4b4b4(Tffa657bytesTb4b4b4, Tffa657bytearrayTb4b4b4)Tb4b4b4)Tb4b4b4:
Te6edf3key Tff7b72= Tffa657bytesTb4b4b4(Te6edf3bodyTb4b4b4)
Tff7b72with Tff7b72selfTff7b72.Td2a8ff_lockTb4b4b4:
Te6edf3pending Tff7b72= Tff7b72selfTff7b72.Td2a8ff_pending_pingsTff7b72.Td2a8ffpopTb4b4b4(Te6edf3keyTb4b4b4, Tff7b72NoneTb4b4b4)
Tff7b72if Te6edf3pending Tff7b72is Tff7b72not Tff7b72NoneTb4b4b4:
Te6edf3sent_msTb4b4b4, Te6edf3room Tff7b72= Te6edf3pending
Te6edf3rtt_ms Tff7b72= Tffa657maxTb4b4b4(T79c0ff0Tb4b4b4, Te6edf3_now_msTb4b4b4(Tb4b4b4) Tff7b72- Te6edf3sent_msTb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_record_systemTb4b4b4(Te6edf3roomTb4b4b4, Ta5d6ff"Ta5d6ffPong from hub: Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3rtt_msTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff msTa5d6ff"Tb4b4b4)
Tff7b72return

Tff7b72if Te6edf3t Tff7b72== Te6edf3T_WELCOMETb4b4b4:
Tff7b72selfTff7b72.Td2a8ffwelcomed Tff7b72= Tff7b72True
Te6edf3body Tff7b72= Te6edf3envTff7b72.Td2a8ffgetTb4b4b4(Te6edf3K_BODYTb4b4b4)
Tff7b72if Tffa657isinstanceTb4b4b4(Te6edf3bodyTb4b4b4, Tffa657dictTb4b4b4)Tb4b4b4:
Te6edf3hub_name Tff7b72= Te6edf3bodyTff7b72.Td2a8ffgetTb4b4b4(Te6edf3B_WELCOME_HUBTb4b4b4)
Tff7b72if Tffa657isinstanceTb4b4b4(Te6edf3hub_nameTb4b4b4, Tffa657strTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffhub_name Tff7b72= Te6edf3hub_name
Te6edf3ver Tff7b72= Te6edf3bodyTff7b72.Td2a8ffgetTb4b4b4(Te6edf3B_WELCOME_VERTb4b4b4)
Tff7b72if Tffa657isinstanceTb4b4b4(Te6edf3verTb4b4b4, Tffa657strTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffhub_version Tff7b72= Te6edf3ver
Te6edf3limits Tff7b72= Te6edf3bodyTff7b72.Td2a8ffgetTb4b4b4(Te6edf3B_WELCOME_LIMITSTb4b4b4)
Tff7b72if Tffa657isinstanceTb4b4b4(Te6edf3limitsTb4b4b4, Tffa657dictTb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3L_MAX_NICK_BYTES Tff7b72in Te6edf3limitsTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffmax_nick_bytes Tff7b72= Tffa657intTb4b4b4(Te6edf3limitsTb4b4b4[Te6edf3L_MAX_NICK_BYTESTb4b4b4]Tb4b4b4)
Tff7b72if Te6edf3L_MAX_ROOM_NAME_BYTES Tff7b72in Te6edf3limitsTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffmax_room_name_bytes Tff7b72= Tffa657intTb4b4b4(Te6edf3limitsTb4b4b4[Te6edf3L_MAX_ROOM_NAME_BYTESTb4b4b4]Tb4b4b4)
Tff7b72if Te6edf3L_MAX_MSG_BODY_BYTES Tff7b72in Te6edf3limitsTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffmax_msg_body_bytes Tff7b72= Tffa657intTb4b4b4(Te6edf3limitsTb4b4b4[Te6edf3L_MAX_MSG_BODY_BYTESTb4b4b4]Tb4b4b4)
Tff7b72if Te6edf3L_MAX_ROOMS_PER_SESSION Tff7b72in Te6edf3limitsTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffmax_rooms_per_session Tff7b72= Tffa657intTb4b4b4(Te6edf3limitsTb4b4b4[Te6edf3L_MAX_ROOMS_PER_SESSIONTb4b4b4]Tb4b4b4)
Tff7b72if Te6edf3L_RATE_LIMIT_MSGS_PER_MINUTE Tff7b72in Te6edf3limitsTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffrate_limit_msgs_per_minute Tff7b72= Tffa657intTb4b4b4(Te6edf3limitsTb4b4b4[Te6edf3L_RATE_LIMIT_MSGS_PER_MINUTETb4b4b4]Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_set_statusTb4b4b4(Te6edf3RRCHubTff7b72.Td2a8ffSTATUS_CONNECTEDTb4b4b4, Ta5d6ff"Ta5d6ffConnectedTa5d6ff"Tb4b4b4)
Tff7b72with Tff7b72selfTff7b72.Td2a8ff_lockTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_reconnect_attempts Tff7b72= T79c0ff0
Tff7b72selfTff7b72.Td2a8ffmanagerTff7b72.Td2a8ff_on_welcomeTb4b4b4(Tff7b72selfTb4b4b4)
Tff7b72if Tff7b72selfTff7b72.Td2a8ffauto_listTb4b4b4:
Tff7b72tryTb4b4b4:
Tff7b72with Tff7b72selfTff7b72.Td2a8ff_lockTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_silent_list_pending Tff7b72+Tff7b72= T79c0ff1
Tff7b72selfTff7b72.Td2a8ffsend_commandTb4b4b4(Ta5d6ff"Ta5d6ff/listTa5d6ff"Tb4b4b4, Te6edf3roomTff7b72=Tff7b72NoneTb4b4b4)
Tff7b72except Tf85149ExceptionTb4b4b4:
Tff7b72with Tff7b72selfTff7b72.Td2a8ff_lockTb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ff_silent_list_pending Tff7b72> T79c0ff0Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_silent_list_pending Tff7b72-Tff7b72= T79c0ff1
Tff7b72return

Tff7b72if Te6edf3t Tff7b72== Te6edf3T_JOINEDTb4b4b4:
Te6edf3room Tff7b72= Te6edf3envTff7b72.Td2a8ffgetTb4b4b4(Te6edf3K_ROOMTb4b4b4)
Tff7b72if Tffa657isinstanceTb4b4b4(Te6edf3roomTb4b4b4, Tffa657strTb4b4b4) Tff7b72and Te6edf3roomTb4b4b4:
Te6edf3r Tff7b72= Te6edf3roomTff7b72.Td2a8ffstripTb4b4b4(Tb4b4b4)Tff7b72.Td2a8fflowerTb4b4b4(Tb4b4b4)
Te6edf3body Tff7b72= Te6edf3envTff7b72.Td2a8ffgetTb4b4b4(Te6edf3K_BODYTb4b4b4)
Te6edf3own_hash Tff7b72= Tff7b72selfTff7b72.Td2a8ffmanagerTff7b72.Td2a8ffidentityTff7b72.Td2a8ffhash Tff7b72if Tff7b72selfTff7b72.Td2a8ffmanagerTff7b72.Td2a8ffidentity Tff7b72is Tff7b72not Tff7b72None Tff7b72else Tff7b72None

Te6edf3body_hashes Tff7b72= Tb4b4b4[Tb4b4b4]
Tff7b72if Tffa657isinstanceTb4b4b4(Te6edf3bodyTb4b4b4, Tffa657listTb4b4b4)Tb4b4b4:
Te6edf3body_hashes Tff7b72= Tb4b4b4[Tffa657bytesTb4b4b4(Te6edf3eTb4b4b4) Tff7b72for Te6edf3e Tff7b72in Te6edf3body Tff7b72if Tffa657isinstanceTb4b4b4(Te6edf3eTb4b4b4, Tb4b4b4(Tffa657bytesTb4b4b4, Tffa657bytearrayTb4b4b4)Tb4b4b4)Tb4b4b4]

Tff7b72with Tff7b72selfTff7b72.Td2a8ff_lockTb4b4b4:
Te6edf3self_join Tff7b72= Te6edf3r Tff7b72in Tff7b72selfTff7b72.Td2a8ff_pending_joins
Te6edf3silent Tff7b72= Te6edf3r Tff7b72in Tff7b72selfTff7b72.Td2a8ff_silent_joins
Tff7b72if Te6edf3self_joinTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_pending_joinsTff7b72.Td2a8ffdiscardTb4b4b4(Te6edf3rTb4b4b4)
Tff7b72if Te6edf3silentTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_silent_joinsTff7b72.Td2a8ffdiscardTb4b4b4(Te6edf3rTb4b4b4)

Tff7b72selfTff7b72.Td2a8ffroomsTff7b72.Td2a8ffaddTb4b4b4(Te6edf3rTb4b4b4)
Tff7b72if Te6edf3r Tff7b72not Tff7b72in Tff7b72selfTff7b72.Td2a8ffmessagesTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffmessagesTb4b4b4[Te6edf3rTb4b4b4] Tff7b72= Tb4b4b4[Tb4b4b4]
Te6edf3members Tff7b72= Tff7b72selfTff7b72.Td2a8ffmembersTff7b72.Td2a8ffsetdefaultTb4b4b4(Te6edf3rTb4b4b4, Tffa657setTb4b4b4(Tb4b4b4)Tb4b4b4)
Tff7b72for Te6edf3h Tff7b72in Te6edf3body_hashesTb4b4b4:
Te6edf3membersTff7b72.Td2a8ffaddTb4b4b4(Te6edf3hTb4b4b4)
Tff7b72if Te6edf3own_hash Tff7b72is Tff7b72not Tff7b72NoneTb4b4b4:
Te6edf3membersTff7b72.Td2a8ffaddTb4b4b4(Te6edf3own_hashTb4b4b4)

Tff7b72if Te6edf3self_joinTb4b4b4:
Tff7b72if Tff7b72not Te6edf3silentTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_record_systemTb4b4b4(Te6edf3rTb4b4b4, Ta5d6ff"Ta5d6ffYou joined #Ta5d6ff"Tff7b72+Te6edf3rTb4b4b4)
Tff7b72if Tff7b72selfTff7b72.Td2a8ffauto_whoTb4b4b4:
Tff7b72tryTb4b4b4:
Tff7b72with Tff7b72selfTff7b72.Td2a8ff_lockTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_silent_who_roomsTff7b72.Td2a8ffaddTb4b4b4(Te6edf3rTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffsend_commandTb4b4b4(Ta5d6ff"Ta5d6ff/who Ta5d6ff"Tff7b72+Te6edf3rTb4b4b4, Te6edf3roomTff7b72=Te6edf3rTb4b4b4)
Tff7b72except Tf85149ExceptionTb4b4b4:
Tff7b72with Tff7b72selfTff7b72.Td2a8ff_lockTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_silent_who_roomsTff7b72.Td2a8ffdiscardTb4b4b4(Te6edf3rTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffmanagerTff7b72.Td2a8ffsaveTb4b4b4(Tb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3joiner Tff7b72= Tff7b72None
Tff7b72if Tffa657lenTb4b4b4(Te6edf3body_hashesTb4b4b4) Tff7b72== T79c0ff1 Tff7b72and Tb4b4b4(Te6edf3own_hash Tff7b72is Tff7b72None Tff7b72or Te6edf3body_hashesTb4b4b4[T79c0ff0Tb4b4b4] Tff7b72!= Te6edf3own_hashTb4b4b4)Tb4b4b4:
Te6edf3joiner Tff7b72= Te6edf3body_hashesTb4b4b4[T79c0ff0Tb4b4b4]
Tff7b72if Te6edf3joiner Tff7b72is Tff7b72not Tff7b72NoneTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_record_systemTb4b4b4(Te6edf3rTb4b4b4, Tff7b72selfTff7b72.Td2a8ffdisplay_name_forTb4b4b4(Te6edf3joinerTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff joinedTa5d6ff"Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffmanagerTff7b72.Td2a8ff_notify_changeTb4b4b4(Tff7b72selfTb4b4b4)
Tff7b72return

Tff7b72if Te6edf3t Tff7b72== Te6edf3T_PARTEDTb4b4b4:
Te6edf3room Tff7b72= Te6edf3envTff7b72.Td2a8ffgetTb4b4b4(Te6edf3K_ROOMTb4b4b4)
Tff7b72if Tffa657isinstanceTb4b4b4(Te6edf3roomTb4b4b4, Tffa657strTb4b4b4) Tff7b72and Te6edf3roomTb4b4b4:
Te6edf3r Tff7b72= Te6edf3roomTff7b72.Td2a8ffstripTb4b4b4(Tb4b4b4)Tff7b72.Td2a8fflowerTb4b4b4(Tb4b4b4)
Te6edf3body Tff7b72= Te6edf3envTff7b72.Td2a8ffgetTb4b4b4(Te6edf3K_BODYTb4b4b4)
Te6edf3own_hash Tff7b72= Tff7b72selfTff7b72.Td2a8ffmanagerTff7b72.Td2a8ffidentityTff7b72.Td2a8ffhash Tff7b72if Tff7b72selfTff7b72.Td2a8ffmanagerTff7b72.Td2a8ffidentity Tff7b72is Tff7b72not Tff7b72None Tff7b72else Tff7b72None

Te6edf3body_hashes Tff7b72= Tb4b4b4[Tb4b4b4]
Tff7b72if Tffa657isinstanceTb4b4b4(Te6edf3bodyTb4b4b4, Tffa657listTb4b4b4)Tb4b4b4:
Te6edf3body_hashes Tff7b72= Tb4b4b4[Tffa657bytesTb4b4b4(Te6edf3eTb4b4b4) Tff7b72for Te6edf3e Tff7b72in Te6edf3body Tff7b72if Tffa657isinstanceTb4b4b4(Te6edf3eTb4b4b4, Tb4b4b4(Tffa657bytesTb4b4b4, Tffa657bytearrayTb4b4b4)Tb4b4b4)Tb4b4b4]

Tff7b72with Tff7b72selfTff7b72.Td2a8ff_lockTb4b4b4:
Te6edf3self_part Tff7b72= Te6edf3r Tff7b72in Tff7b72selfTff7b72.Td2a8ff_pending_parts
Tff7b72if Te6edf3self_partTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_pending_partsTff7b72.Td2a8ffdiscardTb4b4b4(Te6edf3rTb4b4b4)

Te6edf3members Tff7b72= Tff7b72selfTff7b72.Td2a8ffmembersTff7b72.Td2a8ffgetTb4b4b4(Te6edf3rTb4b4b4)
Tff7b72if Te6edf3members Tff7b72is Tff7b72not Tff7b72NoneTb4b4b4:
Tff7b72for Te6edf3h Tff7b72in Te6edf3body_hashesTb4b4b4:
Te6edf3membersTff7b72.Td2a8ffdiscardTb4b4b4(Te6edf3hTb4b4b4)
Tff7b72if Te6edf3self_partTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffroomsTff7b72.Td2a8ffdiscardTb4b4b4(Te6edf3rTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffmembersTff7b72.Td2a8ffpopTb4b4b4(Te6edf3rTb4b4b4, Tff7b72NoneTb4b4b4)

Tff7b72if Te6edf3self_partTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffmanagerTff7b72.Td2a8ffsaveTb4b4b4(Tb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3parter Tff7b72= Tff7b72None
Tff7b72if Tffa657lenTb4b4b4(Te6edf3body_hashesTb4b4b4) Tff7b72== T79c0ff1 Tff7b72and Tb4b4b4(Te6edf3own_hash Tff7b72is Tff7b72None Tff7b72or Te6edf3body_hashesTb4b4b4[T79c0ff0Tb4b4b4] Tff7b72!= Te6edf3own_hashTb4b4b4)Tb4b4b4:
Te6edf3parter Tff7b72= Te6edf3body_hashesTb4b4b4[T79c0ff0Tb4b4b4]
Tff7b72if Te6edf3parter Tff7b72is Tff7b72not Tff7b72NoneTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_record_systemTb4b4b4(Te6edf3rTb4b4b4, Tff7b72selfTff7b72.Td2a8ffdisplay_name_forTb4b4b4(Te6edf3parterTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff leftTa5d6ff"Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffmanagerTff7b72.Td2a8ff_notify_changeTb4b4b4(Tff7b72selfTb4b4b4)
Tff7b72return

Tff7b72if Te6edf3t Tff7b72== Te6edf3T_MSGTb4b4b4:
Te6edf3body Tff7b72= Te6edf3envTff7b72.Td2a8ffgetTb4b4b4(Te6edf3K_BODYTb4b4b4)
Te6edf3room Tff7b72= Te6edf3envTff7b72.Td2a8ffgetTb4b4b4(Te6edf3K_ROOMTb4b4b4)
Te6edf3src Tff7b72= Te6edf3envTff7b72.Td2a8ffgetTb4b4b4(Te6edf3K_SRCTb4b4b4)
Te6edf3nick Tff7b72= Te6edf3envTff7b72.Td2a8ffgetTb4b4b4(Te6edf3K_NICKTb4b4b4)
Te6edf3mid Tff7b72= Te6edf3envTff7b72.Td2a8ffgetTb4b4b4(Te6edf3K_IDTb4b4b4)
Te6edf3own_hash Tff7b72= Tff7b72selfTff7b72.Td2a8ffmanagerTff7b72.Td2a8ffidentityTff7b72.Td2a8ffhash Tff7b72if Tff7b72selfTff7b72.Td2a8ffmanagerTff7b72.Td2a8ffidentity Tff7b72is Tff7b72not Tff7b72None Tff7b72else Tff7b72None
Tff7b72if Tffa657isinstanceTb4b4b4(Te6edf3srcTb4b4b4, Tb4b4b4(Tffa657bytesTb4b4b4, Tffa657bytearrayTb4b4b4)Tb4b4b4) Tff7b72and Te6edf3own_hash Tff7b72is Tff7b72not Tff7b72None Tff7b72and Tffa657bytesTb4b4b4(Te6edf3srcTb4b4b4) Tff7b72== Te6edf3own_hashTb4b4b4:
Tff7b72if Tffa657isinstanceTb4b4b4(Te6edf3midTb4b4b4, Tb4b4b4(Tffa657bytesTb4b4b4, Tffa657bytearrayTb4b4b4)Tb4b4b4) Tff7b72and Tffa657bytesTb4b4b4(Te6edf3midTb4b4b4) Tff7b72in Tff7b72selfTff7b72.Td2a8ff_sent_idsTb4b4b4:
Tff7b72return
Tff7b72if Tffa657isinstanceTb4b4b4(Te6edf3srcTb4b4b4, Tb4b4b4(Tffa657bytesTb4b4b4, Tffa657bytearrayTb4b4b4)Tb4b4b4) Tff7b72and Tffa657isinstanceTb4b4b4(Te6edf3nickTb4b4b4, Tffa657strTb4b4b4) Tff7b72and Te6edf3nickTb4b4b4:
Tff7b72with Tff7b72selfTff7b72.Td2a8ff_lockTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffnicksTb4b4b4[Tffa657bytesTb4b4b4(Te6edf3srcTb4b4b4)Tb4b4b4] Tff7b72= Te6edf3nick
Tff7b72if Tffa657isinstanceTb4b4b4(Te6edf3roomTb4b4b4, Tffa657strTb4b4b4) Tff7b72and Te6edf3roomTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffmembersTff7b72.Td2a8ffsetdefaultTb4b4b4(Te6edf3roomTff7b72.Td2a8ffstripTb4b4b4(Tb4b4b4)Tff7b72.Td2a8fflowerTb4b4b4(Tb4b4b4)Tb4b4b4, Tffa657setTb4b4b4(Tb4b4b4)Tb4b4b4)Tff7b72.Td2a8ffaddTb4b4b4(Tffa657bytesTb4b4b4(Te6edf3srcTb4b4b4)Tb4b4b4)
Tff7b72if Tffa657isinstanceTb4b4b4(Te6edf3bodyTb4b4b4, Tffa657strTb4b4b4)Tb4b4b4:
Te6edf3msg Tff7b72= Te6edf3RRCMessageTb4b4b4(
Ta5d6ff"Ta5d6ffmsgTa5d6ff"Tb4b4b4,
Te6edf3roomTff7b72.Td2a8ffstripTb4b4b4(Tb4b4b4)Tff7b72.Td2a8fflowerTb4b4b4(Tb4b4b4) Tff7b72if Tffa657isinstanceTb4b4b4(Te6edf3roomTb4b4b4, Tffa657strTb4b4b4) Tff7b72else Tff7b72NoneTb4b4b4,
Tffa657bytesTb4b4b4(Te6edf3srcTb4b4b4) Tff7b72if Tffa657isinstanceTb4b4b4(Te6edf3srcTb4b4b4, Tb4b4b4(Tffa657bytesTb4b4b4, Tffa657bytearrayTb4b4b4)Tb4b4b4) Tff7b72else Tff7b72NoneTb4b4b4,
Te6edf3nick Tff7b72if Tffa657isinstanceTb4b4b4(Te6edf3nickTb4b4b4, Tffa657strTb4b4b4) Tff7b72else Tff7b72NoneTb4b4b4,
Te6edf3bodyTb4b4b4,
Te6edf3_now_msTb4b4b4(Tb4b4b4)Tb4b4b4,
Tb4b4b4)
Te6edf3is_own Tff7b72= Tffa657isinstanceTb4b4b4(Te6edf3srcTb4b4b4, Tb4b4b4(Tffa657bytesTb4b4b4, Tffa657bytearrayTb4b4b4)Tb4b4b4) Tff7b72and Te6edf3own_hash Tff7b72is Tff7b72not Tff7b72None Tff7b72and Tffa657bytesTb4b4b4(Te6edf3srcTb4b4b4) Tff7b72== Te6edf3own_hash
Tff7b72if Tff7b72not Te6edf3is_ownTb4b4b4:
Te6edf3own_nick Tff7b72= Tff7b72selfTff7b72.Td2a8ffget_effective_nickTb4b4b4(Tb4b4b4)
Te6edf3pat Tff7b72= Te6edf3_mention_reTb4b4b4(Te6edf3own_nickTb4b4b4)
Tff7b72if Te6edf3pat Tff7b72is Tff7b72not Tff7b72None Tff7b72and Te6edf3patTff7b72.Td2a8ffsearchTb4b4b4(Te6edf3bodyTb4b4b4)Tb4b4b4:
Te6edf3msgTff7b72.Td2a8ffmention Tff7b72= Tff7b72True
Tff7b72selfTff7b72.Td2a8ff_record_messageTb4b4b4(Te6edf3msgTb4b4b4)
Tff7b72return

Tff7b72if Te6edf3t Tff7b72== Te6edf3T_NOTICETb4b4b4:
Te6edf3body Tff7b72= Te6edf3envTff7b72.Td2a8ffgetTb4b4b4(Te6edf3K_BODYTb4b4b4)
Te6edf3room Tff7b72= Te6edf3envTff7b72.Td2a8ffgetTb4b4b4(Te6edf3K_ROOMTb4b4b4)
Te6edf3src Tff7b72= Te6edf3envTff7b72.Td2a8ffgetTb4b4b4(Te6edf3K_SRCTb4b4b4)
Tff7b72if Tffa657isinstanceTb4b4b4(Te6edf3bodyTb4b4b4, Tffa657strTb4b4b4)Tb4b4b4:
Te6edf3parsed Tff7b72= Te6edf3_parse_room_list_noticeTb4b4b4(Te6edf3bodyTb4b4b4)
Tff7b72if Te6edf3parsed Tff7b72is Tff7b72not Tff7b72NoneTb4b4b4:
Tff7b72with Tff7b72selfTff7b72.Td2a8ff_lockTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffavailable_rooms Tff7b72= Te6edf3parsed
Te6edf3silent Tff7b72= Tff7b72selfTff7b72.Td2a8ff_silent_list_pending Tff7b72> T79c0ff0
Tff7b72if Te6edf3silentTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_silent_list_pending Tff7b72-Tff7b72= T79c0ff1
Tff7b72selfTff7b72.Td2a8ffmanagerTff7b72.Td2a8ff_notify_changeTb4b4b4(Tff7b72selfTb4b4b4)
Tff7b72if Te6edf3silentTb4b4b4:
Tff7b72return
Te6edf3parsed_who Tff7b72= Te6edf3_parse_who_noticeTb4b4b4(Te6edf3bodyTb4b4b4)
Tff7b72if Te6edf3parsed_who Tff7b72is Tff7b72not Tff7b72NoneTb4b4b4:
Te6edf3who_roomTb4b4b4, Te6edf3who_entries Tff7b72= Te6edf3parsed_who
Tff7b72with Tff7b72selfTff7b72.Td2a8ff_lockTb4b4b4:
Te6edf3members Tff7b72= Tff7b72selfTff7b72.Td2a8ffmembersTff7b72.Td2a8ffsetdefaultTb4b4b4(Te6edf3who_roomTb4b4b4, Tffa657setTb4b4b4(Tb4b4b4)Tb4b4b4)
Tff7b72for Te6edf3nickTb4b4b4, Te6edf3hash_hex Tff7b72in Te6edf3who_entriesTb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3hash_bytes Tff7b72= Tffa657bytesTff7b72.Td2a8fffromhexTb4b4b4(Te6edf3hash_hexTb4b4b4)
Tff7b72except Tf85149ExceptionTb4b4b4:
Tff7b72continue
Tff7b72if Te6edf3nick Tff7b72is Tff7b72NoneTb4b4b4:
Te6edf3membersTff7b72.Td2a8ffaddTb4b4b4(Te6edf3hash_bytesTb4b4b4)
Tff7b72continue
Tff7b72for Te6edf3ph Tff7b72in Te6edf3membersTb4b4b4:
Tff7b72if Te6edf3phTff7b72.Td2a8ffstartswithTb4b4b4(Te6edf3hash_bytesTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffnicksTb4b4b4[Te6edf3phTb4b4b4] Tff7b72= Te6edf3nick
Tff7b72break
Te6edf3silent_who Tff7b72= Te6edf3who_room Tff7b72in Tff7b72selfTff7b72.Td2a8ff_silent_who_rooms
Tff7b72if Te6edf3silent_whoTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_silent_who_roomsTff7b72.Td2a8ffdiscardTb4b4b4(Te6edf3who_roomTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffmanagerTff7b72.Td2a8ff_notify_changeTb4b4b4(Tff7b72selfTb4b4b4)
Tff7b72if Te6edf3silent_whoTb4b4b4:
Tff7b72return
Te6edf3room_n Tff7b72= Te6edf3roomTff7b72.Td2a8ffstripTb4b4b4(Tb4b4b4)Tff7b72.Td2a8fflowerTb4b4b4(Tb4b4b4) Tff7b72if Tffa657isinstanceTb4b4b4(Te6edf3roomTb4b4b4, Tffa657strTb4b4b4) Tff7b72else Tff7b72None
Tff7b72if Te6edf3room_n Tff7b72is Tff7b72None Tff7b72and Tffa657isinstanceTb4b4b4(Te6edf3bodyTb4b4b4, Tffa657strTb4b4b4) Tff7b72and Te6edf3bodyTff7b72.Td2a8ffstripTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72with Tff7b72selfTff7b72.Td2a8ff_lockTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffmotd Tff7b72= Te6edf3body
Tff7b72selfTff7b72.Td2a8ffmanagerTff7b72.Td2a8ff_notify_changeTb4b4b4(Tff7b72selfTb4b4b4)
Te6edf3msg Tff7b72= Te6edf3RRCMessageTb4b4b4(
Ta5d6ff"Ta5d6ffnoticeTa5d6ff"Tb4b4b4,
Te6edf3room_nTb4b4b4,
Tffa657bytesTb4b4b4(Te6edf3srcTb4b4b4) Tff7b72if Tffa657isinstanceTb4b4b4(Te6edf3srcTb4b4b4, Tb4b4b4(Tffa657bytesTb4b4b4, Tffa657bytearrayTb4b4b4)Tb4b4b4) Tff7b72else Tff7b72NoneTb4b4b4,
Tff7b72NoneTb4b4b4,
Te6edf3bodyTb4b4b4,
Te6edf3_now_msTb4b4b4(Tb4b4b4)Tb4b4b4,
Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_record_noticeTb4b4b4(Te6edf3msgTb4b4b4)
Tff7b72return

Tff7b72if Te6edf3t Tff7b72== Te6edf3T_ERRORTb4b4b4:
Te6edf3body Tff7b72= Te6edf3envTff7b72.Td2a8ffgetTb4b4b4(Te6edf3K_BODYTb4b4b4)
Te6edf3room Tff7b72= Te6edf3envTff7b72.Td2a8ffgetTb4b4b4(Te6edf3K_ROOMTb4b4b4)
Te6edf3text Tff7b72= Te6edf3body Tff7b72if Tffa657isinstanceTb4b4b4(Te6edf3bodyTb4b4b4, Tffa657strTb4b4b4) Tff7b72else Ta5d6ff"Ta5d6ff(error)Ta5d6ff"
Te6edf3r Tff7b72= Te6edf3roomTff7b72.Td2a8ffstripTb4b4b4(Tb4b4b4)Tff7b72.Td2a8fflowerTb4b4b4(Tb4b4b4) Tff7b72if Tffa657isinstanceTb4b4b4(Te6edf3roomTb4b4b4, Tffa657strTb4b4b4) Tff7b72else Tff7b72None
Te6edf3rollback_join Tff7b72= Tff7b72False
Tff7b72if Te6edf3rTb4b4b4:
Tff7b72with Tff7b72selfTff7b72.Td2a8ff_lockTb4b4b4:
Tff7b72if Te6edf3r Tff7b72in Tff7b72selfTff7b72.Td2a8ff_pending_joinsTb4b4b4:
Te6edf3rollback_join Tff7b72= Tff7b72True
Tff7b72selfTff7b72.Td2a8ff_pending_joinsTff7b72.Td2a8ffdiscardTb4b4b4(Te6edf3rTb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_silent_joinsTff7b72.Td2a8ffdiscardTb4b4b4(Te6edf3rTb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_pending_partsTff7b72.Td2a8ffdiscardTb4b4b4(Te6edf3rTb4b4b4)
Tff7b72if Te6edf3rollback_joinTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffroomsTff7b72.Td2a8ffdiscardTb4b4b4(Te6edf3rTb4b4b4)
Tff7b72if Te6edf3rollback_joinTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffmanagerTff7b72.Td2a8ffsaveTb4b4b4(Tb4b4b4)
Te6edf3msg Tff7b72= Te6edf3RRCMessageTb4b4b4(
Ta5d6ff"Ta5d6fferrorTa5d6ff"Tb4b4b4,
Te6edf3rTb4b4b4,
Tff7b72NoneTb4b4b4,
Tff7b72NoneTb4b4b4,
Te6edf3textTb4b4b4,
Te6edf3_now_msTb4b4b4(Tb4b4b4)Tb4b4b4,
Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_record_noticeTb4b4b4(Te6edf3msgTb4b4b4)
Tff7b72return

Tff7b72if Te6edf3t Tff7b72== Te6edf3T_RESOURCE_ENVELOPETb4b4b4:
Te6edf3body Tff7b72= Te6edf3envTff7b72.Td2a8ffgetTb4b4b4(Te6edf3K_BODYTb4b4b4)
Tff7b72if Tff7b72not Tffa657isinstanceTb4b4b4(Te6edf3bodyTb4b4b4, Tffa657dictTb4b4b4)Tb4b4b4:
Tff7b72return
Tff7b72tryTb4b4b4:
Te6edf3rid Tff7b72= Te6edf3bodyTff7b72.Td2a8ffgetTb4b4b4(Te6edf3B_RES_IDTb4b4b4)
Te6edf3kind Tff7b72= Te6edf3bodyTff7b72.Td2a8ffgetTb4b4b4(Te6edf3B_RES_KINDTb4b4b4)
Te6edf3size Tff7b72= Te6edf3bodyTff7b72.Td2a8ffgetTb4b4b4(Te6edf3B_RES_SIZETb4b4b4)
Te6edf3sha256 Tff7b72= Te6edf3bodyTff7b72.Td2a8ffgetTb4b4b4(Te6edf3B_RES_SHA256Tb4b4b4)
Te6edf3encoding Tff7b72= Te6edf3bodyTff7b72.Td2a8ffgetTb4b4b4(Te6edf3B_RES_ENCODINGTb4b4b4)
Tff7b72if Tff7b72not Tffa657isinstanceTb4b4b4(Te6edf3ridTb4b4b4, Tb4b4b4(Tffa657bytesTb4b4b4, Tffa657bytearrayTb4b4b4)Tb4b4b4)Tb4b4b4: Tff7b72return
Tff7b72if Tff7b72not Tffa657isinstanceTb4b4b4(Te6edf3kindTb4b4b4, Tffa657strTb4b4b4)Tb4b4b4: Tff7b72return
Tff7b72if Tff7b72not Tffa657isinstanceTb4b4b4(Te6edf3sizeTb4b4b4, Tffa657intTb4b4b4) Tff7b72or Te6edf3size Tff7b72<Tff7b72= T79c0ff0Tb4b4b4: Tff7b72return
Te6edf3room Tff7b72= Te6edf3envTff7b72.Td2a8ffgetTb4b4b4(Te6edf3K_ROOMTb4b4b4)
Tff7b72with Tff7b72selfTff7b72.Td2a8ff_lockTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_resource_expectationsTb4b4b4[Tffa657bytesTb4b4b4(Te6edf3ridTb4b4b4)Tb4b4b4] Tff7b72= Tb4b4b4{
Ta5d6ff"Ta5d6ffkindTa5d6ff"Tb4b4b4: Te6edf3kindTb4b4b4,
Ta5d6ff"Ta5d6ffsizeTa5d6ff"Tb4b4b4: Te6edf3sizeTb4b4b4,
Ta5d6ff"Ta5d6ffsha256Ta5d6ff"Tb4b4b4: Tffa657bytesTb4b4b4(Te6edf3sha256Tb4b4b4) Tff7b72if Tffa657isinstanceTb4b4b4(Te6edf3sha256Tb4b4b4, Tb4b4b4(Tffa657bytesTb4b4b4, Tffa657bytearrayTb4b4b4)Tb4b4b4) Tff7b72else Tff7b72NoneTb4b4b4,
Ta5d6ff"Ta5d6ffencodingTa5d6ff"Tb4b4b4: Te6edf3encoding Tff7b72if Tffa657isinstanceTb4b4b4(Te6edf3encodingTb4b4b4, Tffa657strTb4b4b4) Tff7b72else Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffroomTa5d6ff"Tb4b4b4: Te6edf3roomTff7b72.Td2a8ffstripTb4b4b4(Tb4b4b4)Tff7b72.Td2a8fflowerTb4b4b4(Tb4b4b4) Tff7b72if Tffa657isinstanceTb4b4b4(Te6edf3roomTb4b4b4, Tffa657strTb4b4b4) Tff7b72else Tff7b72NoneTb4b4b4,
Ta5d6ff"Ta5d6ffexpiresTa5d6ff"Tb4b4b4: Te6edf3timeTff7b72.Td2a8ffmonotonicTb4b4b4(Tb4b4b4)Tff7b72+T79c0ff30.0Tb4b4b4,
Tb4b4b4}
Tff7b72except Tf85149ExceptionTb4b4b4:
Tff7b72pass
Tff7b72return

Tff7b72def Td2a8ff_resource_advertisedTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3resourceTb4b4b4)Tb4b4b4:
Tff7b72tryTb4b4b4:
Tff7b72if Tffa657hasattrTb4b4b4(Te6edf3resourceTb4b4b4, Ta5d6ff"Ta5d6ffget_data_sizeTa5d6ff"Tb4b4b4)Tb4b4b4:
Te6edf3size Tff7b72= Te6edf3resourceTff7b72.Td2a8ffget_data_sizeTb4b4b4(Tb4b4b4)
Tff7b72elif Tffa657hasattrTb4b4b4(Te6edf3resourceTb4b4b4, Ta5d6ff"Ta5d6fftotal_sizeTa5d6ff"Tb4b4b4)Tb4b4b4:
Te6edf3size Tff7b72= Te6edf3resourceTff7b72.Td2a8fftotal_size
Tff7b72elseTb4b4b4:
Te6edf3size Tff7b72= Tffa657getattrTb4b4b4(Te6edf3resourceTb4b4b4, Ta5d6ff"Ta5d6ffsizeTa5d6ff"Tb4b4b4, T79c0ff0Tb4b4b4)
Tff7b72except Tf85149ExceptionTb4b4b4:
Tff7b72return Tff7b72False
Tff7b72if Te6edf3size Tff7b72> T79c0ff262144Tb4b4b4:
Tff7b72return Tff7b72False
Tff7b72return Tff7b72True

Tff7b72def Td2a8ff_resource_concludedTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3resourceTb4b4b4)Tb4b4b4:
Tff7b72tryTb4b4b4:
Tff7b72if Te6edf3resourceTff7b72.Td2a8ffstatus Tff7b72!= Te6edf3RNSTff7b72.Td2a8ffResourceTff7b72.Td2a8ffCOMPLETETb4b4b4:
Tff7b72tryTb4b4b4:
Tff7b72if Tffa657hasattrTb4b4b4(Te6edf3resourceTb4b4b4, Ta5d6ff"Ta5d6ffdataTa5d6ff"Tb4b4b4) Tff7b72and Te6edf3resourceTff7b72.Td2a8ffdataTb4b4b4:
Te6edf3resourceTff7b72.Td2a8ffdataTff7b72.Td2a8ffcloseTb4b4b4(Tb4b4b4)
Tff7b72except Tf85149ExceptionTb4b4b4:
Tff7b72pass
Tff7b72return
Tff7b72tryTb4b4b4:
Te6edf3size Tff7b72= Te6edf3resourceTff7b72.Td2a8fftotal_size Tff7b72if Tffa657hasattrTb4b4b4(Te6edf3resourceTb4b4b4, Ta5d6ff"Ta5d6fftotal_sizeTa5d6ff"Tb4b4b4) Tff7b72else Tffa657getattrTb4b4b4(Te6edf3resourceTb4b4b4, Ta5d6ff"Ta5d6ffsizeTa5d6ff"Tb4b4b4, T79c0ff0Tb4b4b4)
Tff7b72except Tf85149ExceptionTb4b4b4:
Te6edf3size Tff7b72= T79c0ff0
Te6edf3data Tff7b72= Tff7b72None
Tff7b72tryTb4b4b4:
Te6edf3data Tff7b72= Te6edf3resourceTff7b72.Td2a8ffdataTff7b72.Td2a8ffreadTb4b4b4(Tb4b4b4)
Tff7b72finallyTb4b4b4:
Tff7b72tryTb4b4b4:
Tff7b72if Tffa657hasattrTb4b4b4(Te6edf3resourceTb4b4b4, Ta5d6ff"Ta5d6ffdataTa5d6ff"Tb4b4b4) Tff7b72and Te6edf3resourceTff7b72.Td2a8ffdataTb4b4b4:
Te6edf3resourceTff7b72.Td2a8ffdataTff7b72.Td2a8ffcloseTb4b4b4(Tb4b4b4)
Tff7b72except Tf85149ExceptionTb4b4b4:
Tff7b72pass
Tff7b72if Te6edf3data Tff7b72is Tff7b72NoneTb4b4b4:
Tff7b72return

Te6edf3now Tff7b72= Te6edf3timeTff7b72.Td2a8ffmonotonicTb4b4b4(Tb4b4b4)
Te6edf3matched Tff7b72= Tff7b72None
Tff7b72with Tff7b72selfTff7b72.Td2a8ff_lockTb4b4b4:
Te6edf3expired Tff7b72= Tb4b4b4[Te6edf3k Tff7b72for Te6edf3kTb4b4b4, Te6edf3v Tff7b72in Tff7b72selfTff7b72.Td2a8ff_resource_expectationsTff7b72.Td2a8ffitemsTb4b4b4(Tb4b4b4) Tff7b72if Te6edf3vTb4b4b4[Ta5d6ff"Ta5d6ffexpiresTa5d6ff"Tb4b4b4] Tff7b72< Te6edf3nowTb4b4b4]
Tff7b72for Te6edf3k Tff7b72in Te6edf3expiredTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_resource_expectationsTff7b72.Td2a8ffpopTb4b4b4(Te6edf3kTb4b4b4, Tff7b72NoneTb4b4b4)
Tff7b72for Te6edf3kTb4b4b4, Te6edf3exp Tff7b72in Tffa657listTb4b4b4(Tff7b72selfTff7b72.Td2a8ff_resource_expectationsTff7b72.Td2a8ffitemsTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3expTb4b4b4[Ta5d6ff"Ta5d6ffsizeTa5d6ff"Tb4b4b4] Tff7b72== Tffa657lenTb4b4b4(Te6edf3dataTb4b4b4)Tb4b4b4:
Te6edf3matched Tff7b72= Te6edf3exp
Tff7b72selfTff7b72.Td2a8ff_resource_expectationsTff7b72.Td2a8ffpopTb4b4b4(Te6edf3kTb4b4b4, Tff7b72NoneTb4b4b4)
Tff7b72break

Te6edf3kind Tff7b72= Te6edf3matchedTb4b4b4[Ta5d6ff"Ta5d6ffkindTa5d6ff"Tb4b4b4] Tff7b72if Te6edf3matched Tff7b72else Te6edf3RES_KIND_BLOB
Te6edf3room Tff7b72= Te6edf3matchedTb4b4b4[Ta5d6ff"Ta5d6ffroomTa5d6ff"Tb4b4b4] Tff7b72if Te6edf3matched Tff7b72else Tff7b72None
Te6edf3encoding Tff7b72= Te6edf3matchedTb4b4b4[Ta5d6ff"Ta5d6ffencodingTa5d6ff"Tb4b4b4] Tff7b72if Te6edf3matched Tff7b72else Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"
Te6edf3sha Tff7b72= Te6edf3matchedTb4b4b4[Ta5d6ff"Ta5d6ffsha256Ta5d6ff"Tb4b4b4] Tff7b72if Te6edf3matched Tff7b72else Tff7b72None
Tff7b72if Te6edf3sha Tff7b72is Tff7b72not Tff7b72NoneTb4b4b4:
Tff7b72if Te6edf3hashlibTff7b72.Td2a8ffsha256Tb4b4b4(Te6edf3dataTb4b4b4)Tff7b72.Td2a8ffdigestTb4b4b4(Tb4b4b4) Tff7b72!= Te6edf3shaTb4b4b4:
Tff7b72return
Tff7b72if Te6edf3kind Tff7b72in Tb4b4b4(Te6edf3RES_KIND_NOTICETb4b4b4, Te6edf3RES_KIND_MOTDTb4b4b4)Tb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3text Tff7b72= Te6edf3dataTff7b72.Td2a8ffdecodeTb4b4b4(Te6edf3encodingTb4b4b4, Te6edf3errorsTff7b72=Ta5d6ff"Ta5d6ffreplaceTa5d6ff"Tb4b4b4)
Tff7b72except Tf85149ExceptionTb4b4b4:
Tff7b72return
Tff7b72if Te6edf3kind Tff7b72== Te6edf3RES_KIND_MOTDTb4b4b4:
Tff7b72with Tff7b72selfTff7b72.Td2a8ff_lockTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffmotd Tff7b72= Te6edf3text
Tff7b72selfTff7b72.Td2a8ffmanagerTff7b72.Td2a8ff_notify_changeTb4b4b4(Tff7b72selfTb4b4b4)
Te6edf3msg Tff7b72= Te6edf3RRCMessageTb4b4b4(Ta5d6ff"Ta5d6ffnoticeTa5d6ff"Tb4b4b4, Te6edf3roomTb4b4b4, Tff7b72NoneTb4b4b4, Tff7b72NoneTb4b4b4, Te6edf3textTb4b4b4, Te6edf3_now_msTb4b4b4(Tb4b4b4)Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_record_noticeTb4b4b4(Te6edf3msgTb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_logTb4b4b4(Ta5d6ff"Ta5d6ffresource handling failed: Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)


Tff7b72class T56d364RRCManagerTb4b4b4:
Tff7b72def Tff7b72__init__Tb4b4b4(Tff7b72selfTb4b4b4, Te6edf3appTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffapp Tff7b72= Te6edf3app
Tff7b72selfTff7b72.Td2a8ffhubs Tff7b72= Tb4b4b4[Tb4b4b4]
Tff7b72selfTff7b72.Td2a8ff_lock Tff7b72= Te6edf3threadingTff7b72.Td2a8ffRLockTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_change_callback Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ff_message_callback Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ff_active_hub Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ff_active_room Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ff_loaded Tff7b72= Tff7b72False
Tff7b72selfTff7b72.Td2a8ff_loading Tff7b72= Tff7b72False
Tff7b72selfTff7b72.Td2a8ff_save_lock Tff7b72= Te6edf3threadingTff7b72.Td2a8ffLockTb4b4b4(Tb4b4b4)

Tf0883e@property
Tff7b72def Td2a8ffidentityTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72return Tff7b72selfTff7b72.Td2a8ffappTff7b72.Td2a8ffidentity

Tff7b72def Td2a8ffget_nicknameTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3n Tff7b72= Tff7b72selfTff7b72.Td2a8ffappTff7b72.Td2a8ffpeer_settingsTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffdisplay_nameTa5d6ff"Tb4b4b4)
Tff7b72if Tffa657isinstanceTb4b4b4(Te6edf3nTb4b4b4, Tffa657strTb4b4b4)Tb4b4b4:
Tff7b72return Te6edf3n
Tff7b72except Tf85149ExceptionTb4b4b4:
Tff7b72pass
Tff7b72return Tff7b72None

Tff7b72def Td2a8ffset_change_callbackTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3cbTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_change_callback Tff7b72= Te6edf3cb

Tff7b72def Td2a8ffset_message_callbackTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3cbTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_message_callback Tff7b72= Te6edf3cb

Tff7b72def Td2a8ff_notify_changeTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3hubTff7b72=Tff7b72NoneTb4b4b4)Tb4b4b4:
Tff7b72tryTb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ff_change_callback Tff7b72is Tff7b72not Tff7b72NoneTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_change_callbackTb4b4b4(Te6edf3hubTb4b4b4)
Tff7b72except Tf85149ExceptionTb4b4b4:
Tff7b72pass

Tff7b72def Td2a8ff_notify_messagesTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3hubTb4b4b4, Te6edf3msgTb4b4b4)Tb4b4b4:
Tff7b72tryTb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ff_message_callback Tff7b72is Tff7b72not Tff7b72NoneTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_message_callbackTb4b4b4(Te6edf3hubTb4b4b4, Te6edf3msgTb4b4b4)
Tff7b72except Tf85149ExceptionTb4b4b4:
Tff7b72pass

Tff7b72def Td2a8ff_on_welcomeTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3hubTb4b4b4)Tb4b4b4:
Tff7b72for Te6edf3r Tff7b72in Tffa657listTb4b4b4(Te6edf3hubTff7b72.Td2a8ffroomsTb4b4b4)Tb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3hubTff7b72.Td2a8ffjoin_roomTb4b4b4(Te6edf3rTb4b4b4, Te6edf3silentTff7b72=Tff7b72TrueTb4b4b4)
Tff7b72except Tf85149ExceptionTb4b4b4:
Tff7b72pass

Tff7b72def Td2a8ffset_activeTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3hubTb4b4b4, Te6edf3roomTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_active_hub Tff7b72= Te6edf3hub
Tff7b72selfTff7b72.Td2a8ff_active_room Tff7b72= Te6edf3room
Tff7b72if Te6edf3hub Tff7b72is Tff7b72not Tff7b72None Tff7b72and Te6edf3room Tff7b72is Tff7b72not Tff7b72NoneTb4b4b4:
Te6edf3hubTff7b72.Td2a8ffmark_readTb4b4b4(Te6edf3roomTb4b4b4)

Tff7b72def Td2a8ffactive_room_forTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3hubTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ff_active_hub Tff7b72is Te6edf3hubTb4b4b4:
Tff7b72return Tff7b72selfTff7b72.Td2a8ff_active_room
Tff7b72return Tff7b72None

Tff7b72def Td2a8ffhas_unreadTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72with Tff7b72selfTff7b72.Td2a8ff_lockTb4b4b4:
Tff7b72for Te6edf3hub Tff7b72in Tff7b72selfTff7b72.Td2a8ffhubsTb4b4b4:
Tff7b72if Te6edf3hubTff7b72.Td2a8ffunread_roomsTb4b4b4:
Tff7b72return Tff7b72True
Tff7b72return Tff7b72False

Tff7b72def Td2a8ffadd_hubTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3hub_hashTb4b4b4, Te6edf3dest_nameTff7b72=Tff7b72NoneTb4b4b4, Te6edf3nameTff7b72=Tff7b72NoneTb4b4b4)Tb4b4b4:
Tff7b72with Tff7b72selfTff7b72.Td2a8ff_lockTb4b4b4:
Tff7b72for Te6edf3h Tff7b72in Tff7b72selfTff7b72.Td2a8ffhubsTb4b4b4:
Tff7b72if Te6edf3hTff7b72.Td2a8ffhub_hash Tff7b72== Te6edf3hub_hash Tff7b72and Tb4b4b4(Te6edf3hTff7b72.Td2a8ffdest_name Tff7b72== Tb4b4b4(Te6edf3dest_name Tff7b72or Te6edf3DEFAULT_DEST_NAMETb4b4b4)Tb4b4b4)Tb4b4b4:
Tff7b72return Te6edf3h
Te6edf3hub Tff7b72= Te6edf3RRCHubTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3hub_hashTb4b4b4, Te6edf3dest_nameTff7b72=Te6edf3dest_nameTb4b4b4, Te6edf3nameTff7b72=Te6edf3nameTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffhubsTff7b72.Td2a8ffappendTb4b4b4(Te6edf3hubTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffsaveTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_notify_changeTb4b4b4(Tb4b4b4)
Tff7b72return Te6edf3hub

Tff7b72def Td2a8ffremove_hubTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3hubTb4b4b4)Tb4b4b4:
Tff7b72with Tff7b72selfTff7b72.Td2a8ff_lockTb4b4b4:
Tff7b72if Te6edf3hub Tff7b72in Tff7b72selfTff7b72.Td2a8ffhubsTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffhubsTff7b72.Td2a8ffremoveTb4b4b4(Te6edf3hubTb4b4b4)
Tff7b72tryTb4b4b4:
Te6edf3hubTff7b72.Td2a8ffdisconnectTb4b4b4(Tb4b4b4)
Tff7b72except Tf85149ExceptionTb4b4b4:
Tff7b72pass
Tff7b72selfTff7b72.Td2a8ffsaveTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_notify_changeTb4b4b4(Tb4b4b4)

Tff7b72def Td2a8fffind_hubTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3hub_hashTb4b4b4, Te6edf3dest_nameTff7b72=Tff7b72NoneTb4b4b4)Tb4b4b4:
Te6edf3dn Tff7b72= Te6edf3dest_name Tff7b72or Te6edf3DEFAULT_DEST_NAME
Tff7b72with Tff7b72selfTff7b72.Td2a8ff_lockTb4b4b4:
Tff7b72for Te6edf3h Tff7b72in Tff7b72selfTff7b72.Td2a8ffhubsTb4b4b4:
Tff7b72if Te6edf3hTff7b72.Td2a8ffhub_hash Tff7b72== Te6edf3hub_hash Tff7b72and Te6edf3hTff7b72.Td2a8ffdest_name Tff7b72== Te6edf3dnTb4b4b4:
Tff7b72return Te6edf3h
Tff7b72return Tff7b72None

Tff7b72def Td2a8ff_store_pathTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72return Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffjoinTb4b4b4(Tff7b72selfTff7b72.Td2a8ffappTff7b72.Td2a8ffstoragepathTb4b4b4, Ta5d6ff"Ta5d6ffrrc_hubsTa5d6ff"Tb4b4b4)

Tff7b72def Td2a8ff_history_rootTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72return Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffjoinTb4b4b4(Tff7b72selfTff7b72.Td2a8ffappTff7b72.Td2a8ffstoragepathTb4b4b4, Te6edf3HISTORY_DIR_NAMETb4b4b4)

Tff7b72def Td2a8ff_history_dirTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3hubTb4b4b4)Tb4b4b4:
Te6edf3hub_key Tff7b72= Te6edf3hubTff7b72.Td2a8ffhub_hashTff7b72.Td2a8ffhexTb4b4b4(Tb4b4b4)
Tff7b72if Te6edf3hubTff7b72.Td2a8ffdest_name Tff7b72and Te6edf3hubTff7b72.Td2a8ffdest_name Tff7b72!= Te6edf3DEFAULT_DEST_NAMETb4b4b4:
Te6edf3suffix Tff7b72= Te6edf3hashlibTff7b72.Td2a8ffsha256Tb4b4b4(Te6edf3hubTff7b72.Td2a8ffdest_nameTff7b72.Td2a8ffencodeTb4b4b4(Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4)Tb4b4b4)Tff7b72.Td2a8ffhexdigestTb4b4b4(Tb4b4b4)Tb4b4b4[Tb4b4b4:T79c0ff8Tb4b4b4]
Te6edf3hub_key Tff7b72= Te6edf3hub_key Tff7b72+ Ta5d6ff"Ta5d6ff__Ta5d6ff" Tff7b72+ Te6edf3suffix
Tff7b72return Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffjoinTb4b4b4(Tff7b72selfTff7b72.Td2a8ff_history_rootTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3hub_keyTb4b4b4)

Tff7b72def Td2a8ff_history_pathTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3hubTb4b4b4, Te6edf3roomTb4b4b4)Tb4b4b4:
Te6edf3sanitized Tff7b72= Te6edf3HISTORY_FILENAME_SANITIZE_RETff7b72.Td2a8ffsubTb4b4b4(Ta5d6ff"Ta5d6ff_Ta5d6ff"Tb4b4b4, Te6edf3room Tff7b72or Ta5d6ff"Ta5d6ff"Tb4b4b4)Tb4b4b4[Tb4b4b4:T79c0ff64Tb4b4b4]
Te6edf3room_hash Tff7b72= Te6edf3hashlibTff7b72.Td2a8ffsha256Tb4b4b4(Tb4b4b4(Te6edf3room Tff7b72or Ta5d6ff"Ta5d6ff"Tb4b4b4)Tff7b72.Td2a8ffencodeTb4b4b4(Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4)Tb4b4b4)Tff7b72.Td2a8ffhexdigestTb4b4b4(Tb4b4b4)Tb4b4b4[Tb4b4b4:T79c0ff8Tb4b4b4]
Te6edf3filename Tff7b72= Tb4b4b4(Te6edf3sanitized Tff7b72+ Ta5d6ff"Ta5d6ff_Ta5d6ff" Tff7b72+ Te6edf3room_hash Tff7b72+ Ta5d6ff"Ta5d6ff.logTa5d6ff"Tb4b4b4) Tff7b72if Te6edf3sanitized Tff7b72else Tb4b4b4(Te6edf3room_hash Tff7b72+ Ta5d6ff"Ta5d6ff.logTa5d6ff"Tb4b4b4)
Tff7b72return Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffjoinTb4b4b4(Tff7b72selfTff7b72.Td2a8ff_history_dirTb4b4b4(Te6edf3hubTb4b4b4)Tb4b4b4, Te6edf3filenameTb4b4b4)

Tff7b72def Td2a8ff_ensure_history_dirTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3hubTb4b4b4)Tb4b4b4:
Te6edf3d Tff7b72= Tff7b72selfTff7b72.Td2a8ff_history_dirTb4b4b4(Te6edf3hubTb4b4b4)
Te6edf3osTff7b72.Td2a8ffmakedirsTb4b4b4(Te6edf3dTb4b4b4, Te6edf3exist_okTff7b72=Tff7b72TrueTb4b4b4)
Tff7b72return Te6edf3d

Tff7b72def Td2a8ffloadTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ff_loadedTb4b4b4:
Tff7b72return
Tff7b72selfTff7b72.Td2a8ff_loaded Tff7b72= Tff7b72True
Te6edf3path Tff7b72= Tff7b72selfTff7b72.Td2a8ff_store_pathTb4b4b4(Tb4b4b4)
Tff7b72if Tff7b72not Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisfileTb4b4b4(Te6edf3pathTb4b4b4)Tb4b4b4:
Tff7b72return
Tff7b72selfTff7b72.Td2a8ff_loading Tff7b72= Tff7b72True
Tff7b72tryTb4b4b4:
Tff7b72with Tffa657openTb4b4b4(Te6edf3pathTb4b4b4, Ta5d6ff"Ta5d6ffrbTa5d6ff"Tb4b4b4) Tff7b72as Te6edf3fTb4b4b4:
Te6edf3data Tff7b72= Te6edf3fTff7b72.Td2a8ffreadTb4b4b4(Tb4b4b4)
Te6edf3obj Tff7b72= Te6edf3cborTff7b72.Td2a8ffdecodeTb4b4b4(Te6edf3dataTb4b4b4)
Tff7b72if Tff7b72not Tffa657isinstanceTb4b4b4(Te6edf3objTb4b4b4, Tffa657dictTb4b4b4)Tb4b4b4:
Tff7b72return
Te6edf3entries Tff7b72= Te6edf3objTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffhubsTa5d6ff"Tb4b4b4)
Tff7b72if Tff7b72not Tffa657isinstanceTb4b4b4(Te6edf3entriesTb4b4b4, Tffa657listTb4b4b4)Tb4b4b4:
Tff7b72return
Tff7b72for Te6edf3e Tff7b72in Te6edf3entriesTb4b4b4:
Tff7b72if Tff7b72not Tffa657isinstanceTb4b4b4(Te6edf3eTb4b4b4, Tffa657dictTb4b4b4)Tb4b4b4:
Tff7b72continue
Te6edf3hh Tff7b72= Te6edf3eTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffhashTa5d6ff"Tb4b4b4)
Tff7b72if Tff7b72not Tffa657isinstanceTb4b4b4(Te6edf3hhTb4b4b4, Tb4b4b4(Tffa657bytesTb4b4b4, Tffa657bytearrayTb4b4b4)Tb4b4b4)Tb4b4b4:
Tff7b72continue
Te6edf3dn Tff7b72= Te6edf3eTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffdest_nameTa5d6ff"Tb4b4b4)
Te6edf3nm Tff7b72= Te6edf3eTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffnameTa5d6ff"Tb4b4b4)
Te6edf3hub Tff7b72= Tff7b72selfTff7b72.Td2a8ffadd_hubTb4b4b4(Tffa657bytesTb4b4b4(Te6edf3hhTb4b4b4)Tb4b4b4, Te6edf3dest_nameTff7b72=Te6edf3dn Tff7b72if Tffa657isinstanceTb4b4b4(Te6edf3dnTb4b4b4, Tffa657strTb4b4b4) Tff7b72else Tff7b72NoneTb4b4b4, Te6edf3nameTff7b72=Te6edf3nm Tff7b72if Tffa657isinstanceTb4b4b4(Te6edf3nmTb4b4b4, Tffa657strTb4b4b4) Tff7b72else Tff7b72NoneTb4b4b4)
Te6edf3rooms Tff7b72= Te6edf3eTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffroomsTa5d6ff"Tb4b4b4)
Tff7b72if Tffa657isinstanceTb4b4b4(Te6edf3roomsTb4b4b4, Tffa657listTb4b4b4)Tb4b4b4:
Tff7b72for Te6edf3r Tff7b72in Te6edf3roomsTb4b4b4:
Tff7b72if Tffa657isinstanceTb4b4b4(Te6edf3rTb4b4b4, Tffa657strTb4b4b4)Tb4b4b4:
Te6edf3hubTff7b72.Td2a8ffadd_roomTb4b4b4(Te6edf3rTb4b4b4)
Te6edf3parted Tff7b72= Te6edf3eTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffparted_roomsTa5d6ff"Tb4b4b4)
Tff7b72if Tffa657isinstanceTb4b4b4(Te6edf3partedTb4b4b4, Tffa657listTb4b4b4)Tb4b4b4:
Tff7b72for Te6edf3r Tff7b72in Te6edf3partedTb4b4b4:
Tff7b72if Tffa657isinstanceTb4b4b4(Te6edf3rTb4b4b4, Tffa657strTb4b4b4)Tb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3rn Tff7b72= Te6edf3hubTff7b72.Td2a8ff_normalize_roomTb4b4b4(Te6edf3rTb4b4b4)
Tff7b72with Te6edf3hubTff7b72.Td2a8ff_lockTb4b4b4:
Te6edf3hubTff7b72.Td2a8ffmessagesTff7b72.Td2a8ffsetdefaultTb4b4b4(Te6edf3rnTb4b4b4, Tb4b4b4[Tb4b4b4]Tb4b4b4)
Tff7b72except Tf85149ExceptionTb4b4b4:
Tff7b72pass
Te6edf3ar Tff7b72= Te6edf3eTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffauto_reconnectTa5d6ff"Tb4b4b4)
Tff7b72if Tffa657isinstanceTb4b4b4(Te6edf3arTb4b4b4, Tffa657boolTb4b4b4)Tb4b4b4:
Te6edf3hubTff7b72.Td2a8ffauto_reconnect Tff7b72= Te6edf3ar
Te6edf3al Tff7b72= Te6edf3eTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffauto_listTa5d6ff"Tb4b4b4)
Tff7b72if Tffa657isinstanceTb4b4b4(Te6edf3alTb4b4b4, Tffa657boolTb4b4b4)Tb4b4b4:
Te6edf3hubTff7b72.Td2a8ffauto_list Tff7b72= Te6edf3al
Te6edf3aw Tff7b72= Te6edf3eTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffauto_whoTa5d6ff"Tb4b4b4)
Tff7b72if Tffa657isinstanceTb4b4b4(Te6edf3awTb4b4b4, Tffa657boolTb4b4b4)Tb4b4b4:
Te6edf3hubTff7b72.Td2a8ffauto_who Tff7b72= Te6edf3aw
Te6edf3no Tff7b72= Te6edf3eTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffnickTa5d6ff"Tb4b4b4)
Tff7b72if Tffa657isinstanceTb4b4b4(Te6edf3noTb4b4b4, Tffa657strTb4b4b4) Tff7b72and Te6edf3noTb4b4b4:
Te6edf3hubTff7b72.Td2a8ffnick_override Tff7b72= Te6edf3no
Tff7b72tryTb4b4b4:
Te6edf3hubTff7b72.Td2a8ff_load_historyTb4b4b4(Tb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3exTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffFailed to load RRC history for Ta5d6ff"Tff7b72+Te6edf3hubTff7b72.Td2a8ffnameTff7b72+Ta5d6ff"Ta5d6ff: Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3exTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffFailed to load RRC hubs: Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Tff7b72finallyTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_loading Tff7b72= Tff7b72False

Tff7b72def Td2a8ffsaveTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ff_loadingTb4b4b4:
Tff7b72return
Te6edf3path Tff7b72= Tff7b72selfTff7b72.Td2a8ff_store_pathTb4b4b4(Tb4b4b4)
Te6edf3tmp_path Tff7b72= Te6edf3path Tff7b72+ Ta5d6ff"Ta5d6ff.tmpTa5d6ff"
Tff7b72with Tff7b72selfTff7b72.Td2a8ff_save_lockTb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3entries Tff7b72= Tb4b4b4[Tb4b4b4]
Tff7b72with Tff7b72selfTff7b72.Td2a8ff_lockTb4b4b4:
Tff7b72for Te6edf3h Tff7b72in Tff7b72selfTff7b72.Td2a8ffhubsTb4b4b4:
Te6edf3joined Tff7b72= Tffa657setTb4b4b4(Te6edf3hTff7b72.Td2a8ffroomsTb4b4b4)
Te6edf3parted Tff7b72= Tffa657setTb4b4b4(Te6edf3hTff7b72.Td2a8ffmessagesTff7b72.Td2a8ffkeysTb4b4b4(Tb4b4b4)Tb4b4b4) Tff7b72- Te6edf3joined
Te6edf3entry Tff7b72= Tb4b4b4{
Ta5d6ff"Ta5d6ffhashTa5d6ff"Tb4b4b4: Te6edf3hTff7b72.Td2a8ffhub_hashTb4b4b4,
Ta5d6ff"Ta5d6ffdest_nameTa5d6ff"Tb4b4b4: Te6edf3hTff7b72.Td2a8ffdest_nameTb4b4b4,
Ta5d6ff"Ta5d6ffnameTa5d6ff"Tb4b4b4: Te6edf3hTff7b72.Td2a8ffnameTb4b4b4,
Ta5d6ff"Ta5d6ffroomsTa5d6ff"Tb4b4b4: Tffa657sortedTb4b4b4(Te6edf3joinedTb4b4b4)Tb4b4b4,
Ta5d6ff"Ta5d6ffparted_roomsTa5d6ff"Tb4b4b4: Tffa657sortedTb4b4b4(Te6edf3partedTb4b4b4)Tb4b4b4,
Ta5d6ff"Ta5d6ffauto_reconnectTa5d6ff"Tb4b4b4: Tffa657boolTb4b4b4(Te6edf3hTff7b72.Td2a8ffauto_reconnectTb4b4b4)Tb4b4b4,
Ta5d6ff"Ta5d6ffauto_listTa5d6ff"Tb4b4b4: Tffa657boolTb4b4b4(Te6edf3hTff7b72.Td2a8ffauto_listTb4b4b4)Tb4b4b4,
Ta5d6ff"Ta5d6ffauto_whoTa5d6ff"Tb4b4b4: Tffa657boolTb4b4b4(Te6edf3hTff7b72.Td2a8ffauto_whoTb4b4b4)Tb4b4b4,
Tb4b4b4}
Tff7b72if Tffa657isinstanceTb4b4b4(Te6edf3hTff7b72.Td2a8ffnick_overrideTb4b4b4, Tffa657strTb4b4b4) Tff7b72and Te6edf3hTff7b72.Td2a8ffnick_overrideTb4b4b4:
Te6edf3entryTb4b4b4[Ta5d6ff"Ta5d6ffnickTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3hTff7b72.Td2a8ffnick_override
Te6edf3entriesTff7b72.Td2a8ffappendTb4b4b4(Te6edf3entryTb4b4b4)
Te6edf3data Tff7b72= Te6edf3cborTff7b72.Td2a8ffencodeTb4b4b4(Tb4b4b4{Ta5d6ff"Ta5d6ffhubsTa5d6ff"Tb4b4b4: Te6edf3entriesTb4b4b4}Tb4b4b4)
Tff7b72with Tffa657openTb4b4b4(Te6edf3tmp_pathTb4b4b4, Ta5d6ff"Ta5d6ffwbTa5d6ff"Tb4b4b4) Tff7b72as Te6edf3fTb4b4b4:
Te6edf3fTff7b72.Td2a8ffwriteTb4b4b4(Te6edf3dataTb4b4b4)
Te6edf3fTff7b72.Td2a8ffflushTb4b4b4(Tb4b4b4)
Tff7b72tryTb4b4b4: Te6edf3osTff7b72.Td2a8fffsyncTb4b4b4(Te6edf3fTff7b72.Td2a8fffilenoTb4b4b4(Tb4b4b4)Tb4b4b4)
Tff7b72except Tf85149ExceptionTb4b4b4: Tff7b72pass
Te6edf3osTff7b72.Td2a8ffreplaceTb4b4b4(Te6edf3tmp_pathTb4b4b4, Te6edf3pathTb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
T8b949e#
T8b949e#
T8b949e#
T8b949e#
Tff7b72tryTb4b4b4: Te6edf3osTff7b72.Td2a8ffunlinkTb4b4b4(Te6edf3tmp_pathTb4b4b4)
Tff7b72except Tf85149ExceptionTb4b4b4: Tff7b72pass

Tff7b72def Td2a8ffshutdownTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72for Te6edf3h Tff7b72in Tffa657listTb4b4b4(Tff7b72selfTff7b72.Td2a8ffhubsTb4b4b4)Tb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3hTff7b72.Td2a8ffdisconnectTb4b4b4(Tb4b4b4)
Tff7b72except Tf85149ExceptionTb4b4b4:
Tff7b72pass


──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────